接着上一篇,我们接着讲JSP中的内置隐式对象。这篇博客介绍的是request和response对象。
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。客户端的请求信息被封装在request对象中,通过它才能了解到用户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:
String getParameter(String name) 返回name指定参数的参数值
String[] getParameterValues(String name) 返回包含参数name的所有值的数组
void setAttribute(String, Object) 存储此请中的属性
object getAttribute(String, Object) 返回指定属性的属性值
String getContentType() 得到请求体的MIME类型
String getProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求的服务器主机名
代码实例:
reg.jsp
<body> <h1>用户注册</h1><br/> <hr> <form action="03/request.jsp" name="regForm" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" name="favorite" value="read"/>读书 <input type="checkbox" name="favorite" value="movie"/>电影 <input type="checkbox" name="favorite" value="internet"/>上网 <input type="checkbox" name="favorite" value="football"/>足球 </td> </tr> <tr> <td colspan="2"><input type="submit" value="登陆" /></td> </tr> </table> </form> </body>
request.jsp
<body> <h1>request的内置对象</h1><br/> <hr> <% //设置默认的字符 request.setCharacterEncoding("utf-8"); %> 用户名:<%=request.getParameter("username") %><br> 爱好:<% if(request.getParameterValues("favorite")!=null){ String[] favorite=request.getParameterValues("favorite"); for(String f:favorite){ out.println(f); } } %> </body>
结果显示:
<%request.setCharacterEncoding("utf-8"); %>//解决中文乱码,但不能解决URL传递中文出现的乱码
注意:
但是在测试超链接<a href="request.jsp?username=李四">测试url传参数</a>的时候,我们将参数的value直接在URL上进行赋值。如果赋值的结果是中文,在这种情况下如果使用request的setCharacterEncoding方法来进行修改字符集是无法解决中文乱码的问题的。
正确的解决方法为:在Tomcat服务器中,在server.xml文件修改Connector,在里面添加:URLEncoding="utf-8"即可。
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。同时response对象具有页面(Page)作用域,即访问一个页面时,该页面的response对象只对本次访问有效,其他页面的response对象对当前页面无效。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
常用方法:
String setCharacterEncoding()//设置响应字符编码格式
String getCharacterEncoding()//获取响应字符编码格式
void setContentType(String type)//设置响应MIME类型
sendRedirect(java.lang.String location)//请求重定向
PrintWriter getWriter()//获取打印输出对象
注意:PrintWriter对象的输出先于内置out对象。
解决方法:
out.println();
out.flush();//清空缓冲区并将缓冲区内容输出到浏览器
PrintWriter outer=response.getWriter();
outer.println();
-------------------------------------------*-----------------------------------------------------
代码实例:
reg.jsp
<body> <h1>用户注册</h1><br/> <hr> <form action="03/response.jsp" name="regForm" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" name="favorite" value="read"/>读书 <input type="checkbox" name="favorite" value="movie"/>电影 <input type="checkbox" name="favorite" value="internet"/>上网 <input type="checkbox" name="favorite" value="football"/>足球 </td> </tr> <tr> <td colspan="2"><input type="submit" value="登陆" /></td> </tr> </table> </form> </body>
response.jsp
<body> <% out.println("<h1>内置对象response</h1>"); out.println("<hr>"); //out.flush();//添加缓冲区域刷新 PrintWriter pw=response.getWriter(); pw.println("这里是从内置对象response中获取的输出流。"); //进行服务器响应的重定向操作 response.sendRedirect("request.jsp"); //进行客户端的转发请求操作 //request.getRequestDispatcher("request.jsp").forward(request, response); %> </body>
request.jsp
<body> <h1>request的内置对象</h1><br/> <hr> <% //设置默认的字符 request.setCharacterEncoding("utf-8"); %> 用户名:<%=request.getParameter("username") %><br> 爱好:<% if(request.getParameterValues("favorite")!=null){ String[] favorite=request.getParameterValues("favorite"); for(String f:favorite){ out.println(f); } } %> </body>
注意:在response.jsp的中分别使用的是服务器的请求重定向和客户端的请求转发操作。
首先看看请求重定向的结果:
接下来看看请求转发的结果:
这里总结一下重定向和转发请求的作用:
请求重定向:客户端行为,相当于两次请求,前一次请求的内容不会被保存,url路径会改变(查看上面的图片中的URL)。
response.sendRedirect("request.jsp")
请求转发:服务器行为,一次请求,转发后请求对象会保存,url路径不变(查看上面的图片中的URL)!
requst.getRequestDispatcher("st.jsp").forward(request,response)