1.forward指令,用于将页面的响应转发到另外的页面,既可以发到静态HTML、也可以转发到动态JSP页面,或者容器中的Servlet
语法:
JSP 1.0版本:
<span style="white-space:pre"> </span><jsp:forward page="{relativeURL| <%=expression%>}"/>
JSP 1.1以上的版本:
<span style="white-space:pre"> </span><jsp:forward page="{relativeURL| <%=expression%>}">
<span style="white-space:pre"> </span>{<jsp: param.../>}
</jsp:forward>
第二种方法在与转发时增加额外的请求参数,请求参数值可以通过 HttpServletRequest类的getParameter()方法获取。
例子:
<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
当我们跳转到 forward-result.jsp 页面的时候,可以通过内置对象request来接收那个参数
<%= request.getParameter("age") %>
从表面上看,jsp:forward 指令给人的感觉:它是将用户请求“转发”到另一个新页面,但实际上,jsp:forward 指令并没有重新向新页面发送请求,它只是完全采用了新页面来对用户生成响应--请求依然是一次请求,所以请求参数、请求属性都不会丢失。
2. include指令,动态的include指令,用于包含某个页面
语法格式:
<span style="white-space:pre"> </span><jsp:include page="{relativeURL | <%=expression%> }" flush="true" />
或者是
<jsp:include page="{relativeURL | <%=expression%> }" flush="true" >
<jsp:param name="xxx" value="xxxx"/>
</jsp:include>
forward指令和include指令十分相似,一个采用forward方法,一个采用include方法,区别在于:执行forward的时候,被forward的页面完全代替原有页面;而执行include时,被include的页面只是插入原有页面。简而言之:forward那目标页面代替原有页面,include则拿目标页面插入原有页面。
3.useBean、setProperty、getProperty
这三个指令都与JavaBean相关,一个是初始化一个Java实例,一个为JavaBean实例属性赋值,一个输出JavaBean指令的属性值
useBean:
<span style="white-space:pre"> </span><jsp:useBean id="name" class="classname" scope="page| request | session | application "/>
page为页面有效、request本次请求有效、本次session内有效、application本应用内一直有效
setProperty:
<span style="white-space:pre"> </span><jsp:setProperty name="BeanName" property="propertyType" />
4. JSP脚本的9个内置对象
application、config、exception、out、page、pageContext、request、response、session
web应用成为B/S架构应用,其实也是C/S架构的,只是服务器是web服务器,客户端是浏览器;对于大部分浏览器而言,它们通常负责完成三件事
1.向远程服务器送请求、2.读取远程服务器返回的字符串数据、 3.负责根据字符串数据渲染出一个丰富多彩的页面
web服务器中的Servlet的_jspService()方法解析参数、处理用户请求、生成响应数据。
Jsp 与 Servlet 如何交换数据? web服务器提供4个类似Map的结构:application、session、request、page;分别对应整个web应用有效、一次回话有效、本次请求有效、仅当前页面有效;
所以application对象代表web应用本身,通常它可以是多个JSP、Servlet之间的数据实现共享;访问web应用配置参数;
out对象:页面输出流;out.println("<tr>");
request对象:封装着用户的一次请求,有两种情况:GET、POST
GET是在浏览器地址栏输入访问地址所发送的请求或提交表单发送请求;POST为表单提交;
并不是每个表单域都会生成请求参数,而是有name属性的表单域才会生成请求参数
并且GET方式:URL和参数之间以“?”分隔;而多个参数之间以“&”分隔。
如:http://localhost:8080/xxxx/xxxx.jsp?name=aaa&age=28
response对象:大部分时间不需要response响应客户端请求,因为有out对象;由于out对象是JSPWriter实例,是字符流,无法输出非字符内容;当页面需要动态生成一幅位图、或者输出一个PDF文档,这是就需要response对象
还可以使用response来重定向请求,以及用于客户端增加cookie;(response.sendRedirect("xxxx.jsp"))
重定向是response的另一个用处,与forward不同的是,重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求,与前一次请求不在用一个request范围内,所以发送一次请求的请求参数和request范围的属性全部丢失。相当于在地址栏里重新输入新地址,发送了第二次请求
转发(forward) | 重定向(redirect) |
执行forward后,依然是上一次请求 | 执行redirect后生成第二次请求 |
forward的目标页面可以访问原请求的请求参数,因为依然是同一次请求,所有原请求的请求参数、request范围的属性全部存在 | redirect的目标页面不能访问原请求的请求参数,因为是第二次请求了,所有原请求的请求参数、request范围内的属性全部丢失 |
地址栏里请求的URL不会改变 | 地址栏改为重定向的目标URL,相当于在浏览器地址栏里输入心得URL后回车 |
增加Cookie
Cookie通常用于网站记录客户某些信息,session会随着浏览器的关闭而失效,Cookie会一直存放在客户端机器上,除非超出Cookie的生命期限。
在response的内置对象中提供了方法: void addCookie( Cookie cookie );
<%
String name=request.getParameter("name");
Cookie c = new Cookie("username", name);
c.setMaxAge(24*3600);
response.addCookie(c);
%>
访问Cookie:
<%
Cookie [ ] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("username")) //
out.println( c.getValue() );
}
%>
session对象
通常用于跟踪用户的会话信息,例如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品等等
session.setAttribute("itemMap", itemMap);