Posts Tagged ‘页面’

JSP技术生成动态web页面

星期一, 06月 2nd, 2008

随着WEB技术de发展,WEB内容从一些静态de页到内容丰富de动态页.对于广大WEB开发人员来讲动态页面de生成是一个挑战.有许多de方法来试图解决这个问题,如plug-in技术及基于服务器端deAPIs等方法,但存在de一个问题是这些方法是针对某个特定deweb服务器,如Microsoft提供deASP技术就只针对它deIIS及Personal web服务器.
目前用于生成动态网页较为流行de方法有CGI、PHP及JavaServer Page(JSP)技术等.其中:CGI通过访问其它应用程序来获取信息并返回给浏览器,CGI程序通常用C或PERL语言来开发;Jsp则通过将Jsp组件编译成Java Servlet在服务器端运行来实现动态内容.下面从几个方面比较Jsp与传统CGIde特性:
可移植性:
大多WEB服务器支持CGI接口,但CGI程序自身并不能跨平台运行; Java Servlet程序则具有JAVA程序de优点,可运行在任何平台之上,大多数WEB及应用服务器都支持JAVA及servlet API.
性能上:
传统deCGI环境下,每一次client对CGI程序de请求,都使服务器产生一个新de进程来装载、执行CGI程序.大量de并行请求大大降低了其性能;JSP则没有这个局限,每个程序装载一次,并驻留在服务器内存为以后请求服务.另外JSP在多线程de编写与控制方面比CGI容易得多.
开发及发布:
由于Java Servelt具有JAVAde所有优点,开发起来也相对容易,java简化了对异常de处理;它de面向对象特性使开发人员de协作成为一件简单de事.JSP技术从如下几个方面加快动态网站开发:
1) 将静态页面de开发和动态内容de生成分开
JSP中通过使用HTML或XML标记来规划、设计WEB页de布局和风格;而用JSP标记来实现动态de内容,生成动态内容de部分被封装起来运行于服务器端;这样页面布局和风格可单独编辑与调试而不影响动态内容生成.
2) 组件de重用
多数JSP页通过重用无平台无关de组件—javaBeans来完成复杂de要求.这些组件可在开发人员中重复使用.
3) 通过标记来简化页面开发
通过JSP提供了标记,开发人员可以很容易使用beans组件,设置和访问它们de属性.同时JSP也允许用户自定义标记,还可接受第三方开发de标记,从而可以方便使用第三方提供de功能组件.
在对JSPde特点有所了解之后,接下来就谈谈JSPde安装与开发实例.(操作系统以Nt4.0为例)
为运行JSP page需要安装jdk及jswdk.首先安装jdk,在jdk安装完成后,要确保javac及java能正常工作.然后安装jswdk,实际上只需把jswdk解压到一个目录即可.为了使jswdk正常运行,还需要对环境变量CLASSPATH做如下修改:
如果使用JDK1.1,则不需修改CLASSPATH;如果使用JDK1.2,则设置环境变量JAVA_HOME,使其指向JDK安装路径.
完成上述工作后,就可以启动Java WebServer了.
执行jswdk目录下destartserver.bat文件来启动Java Server,该Web server使用de默认端口为8080.如果Web server新动后,需要重新启动则需要先停止已启动deWeb server,执行stopserver.bat可停止达到此目de.
JavaServer启动后,如果正常则在浏览器de地址中输入:http://localhost:8080/ 就可显示介绍Java Webserver Pagede页面.在jswdk目录下还有一个examples目录,这是jswdk中自带de一个web 应用, 一个web应用包含jsps, servlets,html files, images等资源.我也可以创建一个新deweb应用,从而把自己相关de文件放入其中.让我来分析一下如何创建一个新deweb 应用.
要创建一个新deweb 应用,需要在jswdk安装目录下新建一个目录,如创建一个名为mywebdeweb应用,其目录结构如下:

jswdk_inatall myweb web-inf
servlets
jsp beans
webapp.properties
servlets.properties
mime.properties
mappings.properties
其中:jswdk_install表示jswdkde安装目录;以properties为后缀de四个文件为属性文件,可从jswkd_install/web-inf下拷贝得到.修改jswdk_install目录下dewebserver.xml文件,加入如下一行,其作用是把myapp作相应de映射: <WebApplication id=”mybase1″ mapping=”/myweb” docBase=”myweb”/>
同时修改startserver.bat文件,把 myweb/web-info/jsp/beans目录加到相应de环境变量beanJars中;也可通过在CLASSPATH环境变量中加入该路径来实现.
要加入jsp文件,可把文件放到myweb目录下或它de下一级目录中;要加入servlet,只需把编译正确deservlet放到servlets中;而把编译正确dejava beans放到beans目录下.
请注意在对beans或servlet修改后,要使修改生效,需要重新启动Web Server.
了解这些规则之后,下面就创建第一个JSP文件 myfirst.jsp,其内容如下:
<html>
<head><title> My first Jsp file<titile>
</head>
<body>
<% out.println(”this is my first jsp file”); %>
</body>
</html>
将该文件放在jswkd_install\myweb目录下,如果Web server已启动,则在游览器地址中输入:
http://localhost:8080/myweb/myfirst.jsp
我就可以看到执行de结果.在完成第一个简单dejsp文件后,我可以编写一个java beans,并在jsp文件中调用该beans.
java bean源程序HelloWorld.java内容如下:
public class helloWorld {
public String name ;
public boolean setHello(String name){
this.name = new String(name);
}
public String sayHello()
{
return name;
}

}
用JDK编译该文件:
javac helloWorld.java
在成功编译后,将生成de字节码文件HelloWorld.class放到myweb/web-inf/jsp/beans目录下;
在下面jsp文件test.jsp中调用helloWorld,test.jsp内容如下:
<html>
<head>
<title> Jsp and java bean </title>
</head>
<body>
<jsp:useBean id=”helloBean” scope=”session” class=”HelloWorld” />
<%
String hello = “this is a bean test”;
helloBean.setHello(hello);
out.println(helloBean.sayHello() “<br>”);
%>
</body>
</html>
将该jsp文件放到jswdk_install\myweb\目录下
重新启动web Server,在浏览器地地址中输入:
http://localhost:8080/myweb/test.jsp
就可以显示执行结果;
注意到在test.jsp中
<jsp:useBean id=”helloBean” scope=”session” class=”HelloWorld” /> descope = “session”表明该对象创建后可在同一会话(session)de其它页引用.如我可以在aftertest.jsp中引用test.jsp中创建de对象,aftertest.jsp内容包含下面de相关代码:
<%
helloWorld rebean = (helloWorld)session.getValue(”helloBean”);
out.println(”bean used in aftertest.jsp” rebean.sayHello());
%>
要注意de是要引用de对象必须已创建,否则会出现异常.
下面看看在jsp中使用访问数据dejava beans例子.我所使用de数据库是oracle8,通过SQL*Net创建de数据库连接串名为begpinter,数据库服务器运行在名为begpinterserverde机器上,下面是JspJdbc.javade内容:
// You need to import the java.sql package to use JDBC
import java.sql.*;
import oracle.jdbc.driver.* ;
public class JspJdbc
{
Connection conn = null;

Public ResultSet rset = null;
public JdbcCheckup(){
// Load the Oracle JDBC driver
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
}catch(SQLException e1) {
System.err.println(”executeQuery: ” e1.getMessage());
}
}

public ResultSet executeQuery(String sql) {
rset = null;
try {
conn = DriverManager.getConnection
(”jdbc:oracle:thin:@bgpinterserver:1521:bgpinter”,”SCOTT”, “TIGER”);
Statement stmt = conn.createStatement();
rset = stmt.executeQuery(sql);
}catch(SQLException e1) {
System.err.println(”error: ” e1.getMessage());
}
return rset;
}
}
编译后将JspJdbc.class文件放入myweb\web-inf\jsp\beans目录下.在下面dejsp文件中调用beans,jspdb.jsp内容如下:
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>Database in Jsp</title>
</head>
<body>

<%@ page language=”java” import=”java.sql.*,oracle.jdbc.driver.*” errorPage=”errorpage.jsp” %>
<jsp:useBean id=”jspdatabase” scope=”page” class=”JspJdbc” />
<%
ResultSet rset = jspdatabase.executeQuery(”SELECT * FROM emp”);
out.println(”<table><tr><th>number</th><th>name</th></tr>”);
while (reset.next()) {
out.println(”<tr><td>” rset.getInt(”eptno”) “</td>”);
out.println(”<td>” rset.getString(”enameeptno”) “</td></tr>”);
}
rest.close();
out.println(”</table>”);
%>
</body>
</html>
其中用于显示异常deerrorpage.jsp内容为:
<html>
<body bgcolor=”red”>
<%@ page isErrorPage=”true” %>
<h1> The exception <%= exception.getMessage() %>
</body>
</html>
重新启动Web server使新创建dejava beans生效,如果与数据服务器连接正常,则在浏览器地址中输入
http://localhost:8080/myweb/jspdb.jsp
将显示查询结果.
通过上面de介绍,相信大家对Jsp有所了解.要进一步了解Jsp技术可访问下面de站点:
http://java.sun.com/products/jsp

用定制标签库和配置文件实现对JSP页面元素的访问控制

星期一, 06月 2nd, 2008

控制客户端访问是开发一个基于B/Sde架构de系统de开发者必须考虑de问题.JSPSERVLET规范de基于配置文件de安全策略对资源de控制是以文件为单位de,即只可以定义某个视图全部可以或全部不能被访问.一个比较复杂de系统往往要要求对视图de一部分(如JSP页面里de一个按钮)提供访问控制,只允许被某种角色de用户访问.如果采用可编程de安全策略,因为对用户角色和操作de定义在开发时不能定义,而且这种策略加大了程序员de工作量,它可能不是一种好de办法.

我采用定制标签库和和配置文件来解决这个问题:把要权限控制deJSP页面元素如BUTTON,作为标签de内容.为受保护de内容起一个唯一de名称,把这个名称作为标签de一个属性.某个角色对某个页面元素或一组页面元素是否有权限,在XML配置文件中描述.

例如,下面deJSP页面有“详细”和“修改”两个按钮.

<%@ taglib uri=”http://mytag” prefix=”custTag” %>

<html>

<head>

<title>test</title>

</head>

<body >

<form name=”form1″ >

<table width=”600″ border=”0″ cellspacing=”0″ cellpadding=”2″ >

<tr>

<td>

<custTag:JspSecurity elementName=”employeedetail” >

<input type=”button” name=”detail” value=”详细” >

</custTag:JspSecurity>

<custTag:JspSecurity elementName=”employeemodify” >

<input type=”button” name=”modify” value=”修改” >

</custTag:JspSecurity>

</td>

</tr>

</table>

<br>

</form>

</body>

下面XML配置文件内容表示对角色为commonde用户,只对名为employeedetail de页面元素即“详细”按钮有权限,对角色为“admin”de用户,对名为employeedetail employeemodifyde页面元素即两个按钮都有权限.

<?xml version=”1.0″ encoding=”GB2312″?>

<security>

<htmlElement name=”employeedetail” >

<roleName name=”common” />

<roleName name=”admin” />

</htmlElement>

<htmlElement name=”employeemodify” >

<roleName name=”admin” />

</htmlElement>

</security>

定制标签类JspSecurityTag继承了BodyTagSupport类.BodyTagSupport有一个变量bodyContent指向起始标志和结束标志之间de内容.JspSecurityTagde私有静态变量roleList保存从XML文件中取到角色和页面元素de对应集合,私有变量ElementName对应页面元素de名称.当解析该定制标签时,首先先取到页面元素de名称,再取到当前用户de角色,如果角色有该页面元素de权限,就显示标签正文(即页面元素),否则不显示.

Pagekage com.presentation.viewhelper.JspSecurityTag;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.util.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import org.w3c.dom.*;

import java.io.*;

import javax.xml.parsers.*;

public class JspSecurityTag extends BodyTagSupport {

//保存从XML文件中取到角色和页面元素de对应集合

private static ArrayList roleList;

//页面元素de名称

private String elementName;

public void setElementName(String str)

{

this.elementName=str;

}

public int doAfterBody() throws JspException{

if(roleList==null)

{

roleList=getList();

}

try{

//如果认证通过就显示标签正文,否则跳过标签正文,就这么简单

if(isAuthentificated(elementName))

{

if(bodyContent != null){

JspWriter out=bodyContent.getEnclosingWriter();

bodyContent.writeOut(out);

}else

{

}

}

}catch(Exception e){

throw new JspException();

}

return SKIP_BODY;

}

//XML配置文件中取到角色和页面元素de对应,保存到静态deArrayList

private ArrayList getList()

{

DocumentBuilderFactory dbf =

DocumentBuilderFactory.newInstance();

DocumentBuilder db = null;

Document doc=null;

NodeList childlist = null;

String elementName;

String roleName;

int index;

ArrayList theList = new ArrayList();

try{

db = dbf.newDocumentBuilder();

}catch(Exception e)

{

e.printStackTrace();

}

try{

doc = db.parse(new File(”security.xml”));

}catch(Exception e)

{

e.printStackTrace();

}

//读取页面元素列表

NodeList elementList = doc.getElementsByTagName(”htmlElement”);

for(int i=0;i<elementList.getLength();i )

{

Element name = ((Element)elementList.item(i));

//页面元素de名称

elementName = name.getAttribute(”name”);

//该页面元素对应de有权限de角色de列表

NodeList rolNodeList = ((NodeList)name.getElementsByTagName(”roleName”));

for(int j=0;j<rolNodeList.getLength();j )

{

//有权限de角色de名称

//roleName = ((Element)rolNodeList.item(j)).getNodeValue();

roleName = ((Element)rolNodeList.item(j)).getAttribute(”name”);

theList.add(new ElementAndRole(elementName,roleName));

}

}

return theList;

}

//检查该角色是否有该页面元素de权限

private boolean isAuthentificated(String elementName)

{

String roleName = “”;

//在用户登陆时把该用户de角色保存到SESSION中,这里只是直接从SESSION中取用//户角色.

roleName=this.pageContext.getSession().getAttribute(”rolename”);

// roleList包含elementName属性为elementName,roleName属性为roleNamede//ElementAndRole对象,则该角色有该页面元素de权限

if(roleList.contains(new ElementAndRole(elementName,roleName)))

{

return true;

}

}

return false;

}

//表示角色和页面元素de对应de关系de内部类

class ElementAndRole{

String elementName;

String roleName;

public ElementAndRole(String elementName,String roleName)

{

this.elementName=elementName;

this.roleName=roleName;

}

public boolean equals(Object obj)

{

return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

}

}

}

在标签库能被JSP页面使用前,要做以下三个步骤

1、 JSP页面中包括一个taglib元素,确定需要加载到内存de标签库.前面deJSP文件de第一行:<%@ taglib uri=”http://mytag” prefix=”custTag” %>做de就是这件事.

2、 在配置文件web.xml中使用taglib元素确定TLD文件de位置.在web.xml中增加:

<taglib>

<taglib-uri>http://mytag</taglib-uri>

<taglib-location>

/WEB-INF/mytag.tld

</taglib-location>

</taglib>

3TLD文件必须使用taglib元素标识每个定制标签极其属性.

下面是使用这个标签库对应deTLD文件

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE taglib

PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN”

“http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd”>

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>myTag</shortname>

<uri/>

<tag>

<name>JspSecurity</name>

<tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>

<info>

JspSecurityTag

</info>

<attribute>

<name>elementName</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

jsp页面调用applet实现人民币的大小写转换

星期一, 06月 2nd, 2008

实现方法一

applet实现页面是rmb.jsp,此页面是通过applet来实现人民币小写转换成大写de.此页面有三个变量需要在载入classesde时候进行初始化:

<applet type=”applet” id=”myApplet” codebase = “.” name=”TestApplet”

align=”middle” code=”lqh.rmb.Applicate.Rmb.class”

width=”560″ height=”25″>

<param name=”RGB_Back” value=”241|247|251″>

<param name=”RGB_Fore” value=”255|0|0″/>

<param name=”WIGTH” value=”560″/>

</applet>

变量RGB_Back是初始化背景色de,修改次变量可以使appletde背景色跟自己页面de风格一样;变量RGB_Fore是初始化字体de颜色; WIGTH要和appletde宽度一样,这个变量是保证显示de转换信息在中间显示.

此种方法不能传递值给页面trans.jsp,只能显示并且不能copy.

页面相关代码如下:

<html>

<head>人民币小写转换成大写</head>

<%@ page contenttype=”text/html;charset=gb2312″ %>

<SCRIPT language=JavaScript>

function trans(){

//取变量de值

var aaa=document.rmb. rmb_test.value;

//applet赋变量de值

document.myApplet.setRMB(aaa);

document.myApplet.repaint();

return true;

}

</SCRIPT>

<body>

<form name=”rmb”>

输入金额:<input type=”text” name=”rmb_test” onkeyup=”trans()”><br><hr>

<%@ include file=”../rmb.jsp” %>

</form>

</body>

</html>

实现方法二

applet实现页面是rmb.jsp,此页面是通过applet来实现人民币小写转换成大写de.此页面不需要变量进行初始化,在页面上不显示applet画de图像;而可以把转换de值传递给页面变量:

<applet type=”applet” id=”myApplet” codebase = “.” name=”TestApplet”

align=”middle” code=”lqh.rmb.Applicate.Rmb.class”

width=”0″ height=”0″>

</applet>

页面trans.jsp相关代码如下:

<html>

<head>人民币小写转换成大写</head>

<%@ page contenttype=”text/html;charset=gb2312″ %>

<%@ include file=”../rmb.jsp” %>

<SCRIPT language=JavaScript>

function trans(){

var aaa=document.rmb. rmb_test.value;

//得到转换de值

var rmb = document.myApplet.getRMB(aaa);

document.rmb. rmb_result.value = rmb;

return true;

}

</SCRIPT>

<body>

<form name=”rmb”>

输入金额:<input type=”text” name=”rmb_test” onkeyup=”trans()”><br>

转换结果:<input type=”text” name=”rmb_result” ><br>

</form>

</body>

</html>

附录

1applet相关代码:

package lqh.rmb.Applicate;

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import lqh.rmb.*;

public class Rmb extends Applet {

private boolean isStandalone = false;

private RMBConversion rmb=new RMBConversion();

private String var0 = “”;

private String re_rmb=”";

private String wigth =”0″;

private String back_color;

private String fore_color;

public String getParameter(String key, String def) {

return isStandalone ? System.getProperty(key, def) :

(getParameter(key) != null ? getParameter(key) : def);

}

public void paint(Graphics g) {

if(wigth.equals(”0″)){

wigth = “560″;

}

int i= Integer.parseInt(wigth);

if(checkNum(var0)){

if(var0.endsWith(”.”)){

var0 = var0.substring(0,var0.length()-1);

}

re_rmb= rmb.RMB(var0);

}else{

re_rmb=”输入错误:” var0;

}

int middel =(i - re_rmb.length()*12)/2;

this.setBackground(new Color(getColor(back_color)[0], getColor(back_color)[1], getColor(back_color)[2]));

this.setForeground(new Color(getColor(fore_color)[0], getColor(fore_color)[1], getColor(fore_color)[2]));

g.drawString(re_rmb,middel,20);

}

public void init() {

try {

back_color = this.getParameter(”RGB_Back”, “241|247|251″);

}catch(Exception e) {e.printStackTrace();}

try {

fore_color = this.getParameter(”RGB_Fore”, “255|0|0″);

}catch(Exception e) {e.printStackTrace();}

try {

wigth = this.getParameter(”WIGTH”, “0″);

}catch(Exception e) {e.printStackTrace();}

try {

jbInit();

}catch(Exception e) { e.printStackTrace(); }

}

private void jbInit() throws Exception {

this.setBackground(new Color(getColor(back_color)[0], getColor(back_color)[1], getColor(back_color)[2]));

}

public void setRMB(String rmb_temp){

var0 = rmb_temp;

}

public String getRMB(String rmb_temp){

if(checkNum(rmb_temp)){

if(rmb_temp.endsWith(”.”)){

rmb_temp = rmb_temp.substring(0,rmb_temp.length()-1);

}

re_rmb= rmb.RMB(rmb_temp);

}else{

re_rmb=”输入错误:” rmb_temp;

}

return re_rmb;

}

public boolean checkNum(String str){

String numChar=”0123456789.”;

boolean breakBoolean = false;

for(int i=0;i<str.length();i ){

if(numChar.indexOf(str.substring(i,i 1))<0){

breakBoolean =true;

}

if(breakBoolean) break;

}

if(breakBoolean){

return false;

}else{

if(str.startsWith(”.”)){

return false;

}else{

return true;

}

}

}

public String[][] getParameterInfo() {

String[][] pinfo =

{

{”RGB_Back”, “String”, “”},

{”RGB_Fore”, “String”, “”},

{”WIGTH”, “String”, “”},

};

return pinfo;

}

private int[] getColor(String rgb){

int[] rgb_return = new int[3];

int index =0,nextIndex=0,len=0;

while((index =rgb.indexOf(”|”,nextIndex))>-1){

rgb_return[len]=getInt(rgb.substring(nextIndex,index));

nextIndex=index 1;

len ;

}

rgb_return[len]=getInt(rgb.substring(nextIndex));

return rgb_return;

}

private int getInt(String str){

try{

return Integer.parseInt(str);

}catch(Exception e){

return 0;

}

}

}

2.java包,欢迎索取lqhboy@163.com

让JSP页面过期, 保证每次JSP页面都是最新的.

星期一, 06月 2nd, 2008

response.addHeader("Cache-Control", "no-cache");
response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");

打开页面就是全屏的方法

星期一, 06月 2nd, 2008

<script language="javaScript">
function intro()
{
if ((navigator.appVersion.indexOf("Mac")!=-1) &&
(navigator.userAgent.indexOf("MSIE")!=-1) &&
(parseInt(navigator.appVersion)=4))
{
skip()
}
else
{
popup()
}
}
function skip()
{
location.href="http://yourdomain/index.htm";
}
function popup()
{
version =parseFloat(navigator.appVersion.substring(navigator.appVersion.indexOf(’.')-1,navigator.appVersion.length));
if (version >=4)
version = parseFloat(navigator.appVersion.substring(navigator.appVersion.indexOf(’.')-1,navigator.appVersion.length));
if (version >= 4)
{
if (navigator.appName=="Netscape")
{
Hello = window.open("http://yourdomain/index.htm","Hello","scrollbars");
Hello.focus();
}

if (navigator.appName=="Microsoft Internet Explorer")
{
window.open("http://
yourdomaintg/index.htm","screen","fullscreen==yes");
}
}
else
{
location.href="http://ypurdomain/index.htm";
}
}
</script>
<BODY onload=intro()>
</BODY></HTML>

页面自动刷新,不用按回车键来提交数据!

星期一, 06月 2nd, 2008

如果页面要自动刷新,但该页面有Request.Form,那么通常会出现一个提示框,需要用户确定来提交数据,这就不是自动刷新了.而对于监控或股票显示来说,不要用户干预又非常重要,下面就可以解决该问题:
<Script Language="JavaScript">
<!–
var limit="0:60" //定义刷新时间
if (document.images){
var parselimit=limit.split(":")
parselimit=parselimit[0]*60 parselimit[1]*1
}
function beginrefresh(){
if (!document.images)
return
if (parselimit==1){
InputDate.action="TypeAlert.asp" //此处为该页面de名称,别忘了外面应该有一个Form,用hidden空间保留此页面所需deRequest.Formde数据!
InputDate.submit()
}
else{
parselimit-=1
curmin=Math.floor(parselimit/60)
cursec=parselimit`
if (curmin!=0)
curtime=curmin "分" cursec "秒后重刷本页!"
else
curtime=cursec "秒后重刷本页!"
window.status=curtime
setTimeout("beginrefresh()",1000)
}
}
window.onload=beginrefresh
//–>
</Script>
这段要加到<HEAD>de上面!

JSP教程(六)-怎么在JSP中跳转到别一页面

星期一, 06月 2nd, 2008

在JSP中使用jsp forward Action来实现页面de跳转功能.
  语法:
<jsp:forward page="{relativeURL|<%= expression %>}"/> 或
<jsp:forward page="{relativeURL|<%= expression %>}">
<jsp:param name="parameterName"
value="{parameterValue|<%= expression %>}"/> </jsp:forward>
  这个action使您可以将request向前到另外一个页面.它只有一个属性,page.Page应有一个相对deURL组成.这可以是一个静态de值或者是能够在被请求de时候计算得到de值,就如下面两个例子一般:
<jsp:forward page="/utils/errorReporter.jsp"/>
<jsp:forward page="<%= someJavaExpression %>"/>
!supportEmptyParas]>
  现在以一个具体例子来说明:在test1.jsp中使用forward使其跳转到test2.jsp页面中.
Test1.jsp
<HTML>
<HEAD>
<TITLE>forward test</TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<!–跳转到test2.jsp–!>
<jsp:forward page="/test2.jsp"/>
</BODY>
</HTML>
!supportEmptyParas]>
test2.jsp
<HTML>
<HEAD>
<TITLE> forward test </TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<%out.println("这是jsp2.jsp页面产生出de输出");%>
</BODY>
</HTML>
!supportEmptyParas]>
  运行test1.jsp,可在浏览器中看见:"这是jsp2.jsp页面产生出de输出"de输出信息.但是如果您在test1.jsp和test2.jsp这两个页面中有参数传递怎么办呢?用get方式吧,不但总de长度有限制,使用现在十分不方便,而且有时候还不安全.其实我完全可以使用jsp1.1中给forward里提供depara属性就可以解决.现以test3.jsp和test4.jsp来说明.
!supportEmptyParas]>
Test1.jsp
<HTML>
<HEAD>
<TITLE> forward test </TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<jsp:forward page="/test4.jsp">
<jsp:param name="name" value="powerman"/>
<jsp:param name="address" value=" 北京西大街188号"/>
</jsp:forward>
</BODY>
</HTML>
!supportEmptyParas]>
test2.jsp
<HTML>
<HEAD>
<TITLE>forward test</TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<%
out.println("这是jsp4.jsp页面产生出de输出" "<br>");
out.println("姓名:" request.getParameter("name") "<br>");
out.println("地址:" request.getParameter("address") "<br>");
!supportEmptyParas]>
%>
</BODY>
</HTML>
  运行test3.jsp,可在浏览器中看见:
  "这是jsp4.jsp页面产生出de输出
  姓名:powerman
  地址:北京西大街188号"
de输出信息