【5.5.2 jsp:forward】
jsp:forward 用于将一个JSP的内容传送到page所指定的JSP程序或者servlet去处理。
格式:
【forward.jsp】
Welcome to forward.jsp
<%--直接跳转到forforward.jsp,这两个jsp用的是同一个
request--%>
【forforward.jsp】
Welcome
Here is forforward.jsp
测试,在地址栏输入http://localhost:8080/servlet_example1/forward.jsp,页面显示为
注意页面的内容是forforward.jsp的内容,但是地址栏仍然是forward.jsp。用处:登录之后根据登录情况跳转到相应的页面。【练习1】
【forward1.jsp】
Welcome to forward1.jsp
【forforward1.jsp】
Welcome
Here is forforward1.jsp
<%= request.getParameter("name")%>
<%= request.getParameter("oldName")%>
<%= request.getParameter("roles")%>
<%= request.getParameter("address")%>
测试,在地址栏输入:http://localhost:8080/servlet_example1/forward.jsp,显示
http://localhost:8080/servlet_example1/forward.jsp?name=zhangsan,显示
http://localhost:8080/servlet_example1/forward.jsp?address=jinan,显示
jsp:forward 发生在服务器端,客户端并不知道已经跳转到别的页面了。但是forward和forforward是同一个request对象。
JSP访问第一个页面,第一个页面跳转到第二个页面,第二个页面把内容传递到客户端,但是在客户端的页面上显示的仍然是第一个页面的名字。这两个页面是同一个request对象。
【6.3.1 重定向网页】
而response.sendRedirect则不同。
当你访问第一个页面的时候,页面要求你重新访问另外一个页面,因此客户端浏览器需要访问另外一个页面的地址。因此两个页面使用的是不同的request。
测试:
新建test.jsp:
<%
response.sendRedirect("forforward.jsp");
%>
访问test.jsp,在地址栏输入http://localhost:8080/servlet_example1/test.jsp,结果地址栏变为http://localhost:8080/servlet_example1/forforward.jsp,页面显示为
在地址栏输入:http://localhost:8080/servlet_example1/test.jsp?name=zhangsan,页面显示为
表示无法接受参数。思考一下原因。
【6.2.1 访问请求参数】
request对象代表的是来自客户端的请求,例如在form表单中填写的信息等,是最常用的对象。
关于它的方法使用较多的是getParameter、getParameterNames和getParameterValues,通过调用这几个方法来获取请求对象中所包含的参数的值。
request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到与该属性对应的对象值。
setAttribute与getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端是否执行过这两个方法。
request的getParameter方法的作用是获取到客户端通过表单或url请求参数发送过来的参数值,是客户端与服务器端之间的交互,服务器端要想获取到客户端发送过来的数据,就需要使用getParameter方法来获取。
没有与getParameter方法对应的setParameter方法。
request对象内数据的存活范围就是在request对象的存活范围内,当客户端想服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;
之后再向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中所存放的任何数据。
request对象:可以用此对象取得请求的Header、信息(如浏览器版本、语言和编码等)、请求的方式(get/post)、请求的参数名称、参数值、客户端的主机名称等。对应类javax.servlet.http.HttpServletRequest
常用方法:
●getParameter(String):返回客户端向服务器端传送的参数
值
●getMethod():返回客户端向服务器端传送数据的方法
●getParameterNames():获得客户端传送给服务器端的所有参
数的名字,结果是一个枚举类型的数据(Enumeration)
●getParameterValues(String):获得指定参数的所有值,返
回String[]
●getRequestURL():获得发出请求字符串的客户端地址
●getRemoteAddr():获取客户端的IP地址
●getRemoteHost():获取客户端的机器名称
●getServerName():获取服务器的名字
●getServletName():客户端所请求的脚本文件路径
●getServerPort():获取服务器端的端口
【例6.3】
【6.2.2 在作用域中管理属性】
在进行请求转发时,需要把一些数据传递到转发后的页面进行处理。这时,就需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中。
request对象的setAttribute()方法的语法格式如下:request.setAttribute(String name,Object object);
request对象的getAttribute()方法的语法格式如下:request.getAttribute(String name);
【index.jsp】
<%
request.setAttribute("name","jack");
%>
【forforward.jsp】
Welcome
Here is forforward1.jsp
<%= request.getAttribute("name")%>
【6.3.2 处理HTTP文件头】
response对象
response对象代表的是对客户端的响应,也就是说可以通过response对象来组织发送到客户端的数据。
但是由于组织方式比较底层,所以不建议一般人使用。
需要向客户端发送文字时直接用out对象即可。
response:表示返回给客户端的响应。对应类javax.servlet.http.HttpServletResponse
经常用于设置Http标题、添加cookie、设置响应内容的类型和状态、发送Http重定向和编码URL。
常用方法:
●addCookie(Cookie):添加一个cookie对象。用于在客户端
保存特定的信息
●addHeader(String,String):添加http头信息,该Header
信息将发送到客户端
●containsHeader(String):判断指定名字的HTTP文件头是
否存在
●sendError(int, String):向客户端发送错误的信息
●sendRedirect(String):重定向JSP文件。注意和
●setContentType(String):设置MIME类型与编码方式
【6.4 session对象】
session对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。
HTTP是无状态协议;
Web Server对每一个客户端请求都没有历史记忆;
session用来保存客户端状态信息。
浏览器不关闭,session对象会一直存在(姑且这样认为),且session对象只有一个。
如果浏览器关闭重启,会创建新的session对象。
Cookie是记录在客户端,session是记录在服务器端。但是cookie记录在客户端,用户可以设置不允许写入cookie,用户也可以删除cookie或者修改cookie,不够可靠。
Session是写在服务器端内存中的内容,当写session的时候会为客户端的浏览器记录一个唯一的编号,同时为session也赋予同样的号码。当用户访问第二个页面的时候,服务器端会根据浏览器的编号去找同一个编号对应的session。这个编号叫sessionid。
【6.4.1 创建及获取客户的会话】
这可以通过session对象的setAttribute()方法和getAttribute()方法实现。
【6.4.2 从会话中移除指定的绑定对象】
对于存储在session会话中的对象,如果想将其从session会话中移除,可以使用session对象的removeAttribute()方法,该方法的语法格式如下:
removeAttribute(String name)
【6.4.3 销毁session】
通过session对象的invalidate()方法可以销毁session,其语法格式如下:session.invalidate();
【6.4.4 会话超时的管理】
session.getLastAccessedTime()
返回客户端最后一次与会话相关联的请求时间
session.getMaxInactiveInterval()
以秒为单位返回一个会话内两个请求最大时间间隔
session.setMaxInactiveInterval()
以秒为单位设置session的有效时间
【例6.18】
【index.jsp】
【session.jsp】
<%
String name=request.getParameter("name");
session.setAttribute("name",name);
%>
【result.jsp】
<%String name=(String)session.getAttribute("name");
String solution=request.getParameter("address");
%>
your name is:
<%=name %>
your address is:
<%=solution %>
在地址栏输入
http://localhost:8080/ch5_example/index.jsp
输入姓名,单击ok按钮,提交
进入第二个页面
地址栏变为
http://localhost:8080/ch5_example/session.jsp?name=mm&Submit=ok
输入地址,单击ok按钮,提交
地址栏变为
http://localhost:8080/ch5_example/result.jsp?address=jinan&Submit=ok
【6.2.3 获取cookie】
1、介绍
服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
注意HTTP协议是无连接的,含义就是当客户端从服务器端得到某个文件的内容时,连接就会中断,相当于socket的close方法。但是考虑购物网站,当你在一个页面购买了东西,连接就断了,当你又访问另外一个页面去结账时,这时就不知道购买的东西是什么了。这时的解决办法就是cookie。也就是当你购买了某种商品后,服务器就在客户端记录下相应的信息来,这就是cookie。但是要遵循两个原则:
(1)只允许写文本文档,不允许写其他类型的文件,避免那些恶意的程序。
(2)客户端可以阻止服务器写入。
结账的时候,服务器端只能拿到自己的web application写入的东西。
张三和李四各买了同样的商品,那么可以通过浏览器的独一无二的编号来区分,通过这一点区分不同浏览器的内容。
Cookie:服务器端写到客户端的文本信息,是以名-值-对的形式。
通过cookie的getCookies()方法即可获取到所有cookie对象的集合;
通过cookie对象的getName()方法可以获取到指定名称的cookie;
通过getValue()方法即可获取到cookie对象的值。
另外将一个cookie对象发送到客户端使用了response对象的addCookie()方法。
【login.jsp】
<%@page language="java"import="java.util.*"pageEncoding="GB2312"%>
<%
Cookie[] cookies=request.getCookies();
String user="";
if(cookies!=null)
{
for(int i=0;i if(cookies[i].getName().equals("mrCookie")){ user=cookies[i].getValue(); } } } if("".equals(user)){ %>
<%
}else{%>
欢迎<%=user %>再次光临
<%} %>
【deal.jsp】
<%
String user=request.getParameter("name");
Cookie cookie=new Cookie("mrCookie",user);
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);
%>
测试:
地址栏输入:
http://localhost:8080/ch5_example/login.jsp
页面显示
填写bingbing后提交,地址栏变为
http://localhost:8080/ch5_example/deal.jsp?name=bingbing&Submit=ok
页面显示
【Cookie部分作业】
设计一个用户登录页面,当用户登录后,保存登录信息到cookie,然后当用户再次访问时读取cookie,将登录信息显示在页面上。(密码部分可以考虑加密处理,或者暂时不做处理)
【6.5 application对象】
application对象在整个应用区域中都有效。application对象管理应用程序
环境属性的方法分别介绍如下。
getAttributeNames():获得所有application对象使用的属性名。
getAttribute(String name):从application对象中获取指定对象名。
setAttribute(String key,Object obj):使用指定名称和指定对象在application对象中进行关联。
removeAttribute(String name):从application对象中去掉指定名称的属性。
【index.jsp】
<%@ page language="java"import="java.util.*"pageEncoding="Gb2312"%>
<%
if(application.getAttribute("counter") == null)
{
application.setAttribute("counter", "1");
}
else
{
String strnum = null;
strnum = application.getAttribute("counter").toString();
int icount = 0;
icount = Integer.valueOf(strnum).intValue();
icount++;
application.setAttribute("counter",
Integer.toString(icount));
}
%>
您是第<%=application.getAttribute("counter") %>位访问者!
在地址栏输入:
http://localhost:8080/ch5_example/index.jsp
得到下面的页面:
刷新后,页面变为:
application的存活范围比request和session都要大。
只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器的运行过程当中,application对象只有一个,它会被所有的用户共享。
其中getRealPath这个方法可以获取资源在服务器上的物理路径(绝对路径),常用来获取上传文件时要存储文件的路径。
【6.6 out对象】
out对象代表了向客户端发送数据的对象,与response对象不同,通过out对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过out对象直接向客户端写一个由程序动态生成的HTML文件。
常用的方法除了print和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为out对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。
<%
out.println("hello");
out.println("world");
%>
输出为
<%out.println("hello");out.println("world");%>
输出为
【自学部分】
Session的两种实现方式:
1.通过cookie来实现;
2.通过URL重写来实现。
第一种方式通过cookie来实现。每一个客户端要支持session的话,必须给服务器端传递sessionid。怎么传sessionid?一种方式就是把这个id存在cookie(临时cookie即可)里面。
规则:1.如果浏览器支持cookie,创建session的时候会把sessionid保存在cookie 里面。2.如果浏览器不支持cookie,一方面IE可能禁止不了cookie,session仍然会写在自己的cookie里面,另一方面session有可能就不能正常使用了。这时必须自己编程使用URL重写的方式实现session。要使用方法response.encodeURL(),这个方法的作用有(1)转码(2)URL后面加入sessionid。
测试:登录邮箱。登录页面和使用邮箱页面是两个页面,这时需要用到session,记录sessionid。
下面这个实验要求在支持cookie和阻止cookie两种情况下进行测试。
创建一个SessionInfoServlet:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class SessionInfoServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
HttpSession mySession = request.getSession(true);
//如果传false,就是拿到已有的session;如果传true,没有session
就创建一个,如果有,就拿已有的session.
//MIME type to return is HTML
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("
");out.println("
out.println("");