HttpServletRequest对象是用于封装客户端的请求数据的,底层是HashTable。
便于方便,后文使用request代替,
request的基本使用这里不详细讲解,主要总结一下几点。
1、获取客户端请求参数的方法
1)getParameter(String)
最常用的方法,几乎所有的表单提交过来都能用该方法进行参数获取。
2)getParameterValues(String name)方法
这个针对特殊的表单,比如多选按钮,客户端传递过来的是一个String数组,所以,服务器端解析的时候需要使用该方法进行解析。
String[] insts = request.getParameterValues("inst");
3)getParameterMap方法
由于request对象底层是HashMap,所以,在接受请求参数时候,可以用Map进行接受,将所有的请求参数获取出来。
2、Servlet获取中文请求参数的问题
由于客户端提交过来的中文将会被转码,转码格式为ISO8859-1,所以,当Servlet接收到参数时,也是一串乱码,必须在接收请求参数时,对参数进行指定格式的编码。
1)POST请求中文转码
在获取参数之前,通过resquest设置字符集编码格式可以解决此类问题
/设置request的编码格式
request.setCharacterEncoding("utf-8");
再去获取参数,这样就能完整的取出中文参数了。
2)GET请求中文转码
由于参数是通过URL传递的 , 以上方式针对GET请求转码无效,我们必须先将参数接收进来,再将值进行转码。
//设置requst的编码格式无效,需要将请求数据接受下来进行编码
user = request.getParameter("user");
user = new String(user.getBytes("ISO8859-1") , "utf-8");//转码
或者,就是在服务器端配置URL编码格式:
修改tomcat的配置文件server.xml:
<body>
<h1>测试Attrbute和Parameter</h1>
<form action="servlet/AttributeAndParameter" method="get">
用户:<input type="text" name="user" id="user"><br>
密码:<input type="password" name="pwd" id="pwd"><br>
<input type="submit" id="submit" value="提交" ><br>
<p>返回结果</p>
<%=request.getAttribute("result") %>
</form>
</body>
写一个servlet,作用是接收信息,然后将接收的信息再返回给原页面显示。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user = null;
String pwd = null;
//通过getParameter获取传入的参数
//这里注意如果是以POST方式进来的请求,需要对中文进行转码
String method = request.getMethod();
if(method.equalsIgnoreCase("POST")){
//post请求
//设置request的编码格式
request.setCharacterEncoding("utf-8");
user = request.getParameter("user");
pwd = request.getParameter("pwd");
}else{
//GET请求
//设置requst的编码格式无效,需要将请求数据接受下来进行编码
user = request.getParameter("user");
user = new String(user.getBytes("ISO8859-1") , "utf-8");//转码
pwd = request.getParameter("pwd");
}
System.out.println("<p>请求类型:"+method+ ", 用户:"+user+" , 密码:"+pwd+"</p>");
//返回到页面中
//out.print("<p>请求类型:"+method+ ", 用户:"+user+" , 密码:"+pwd+"</p>");
//测试2
//这里将返回值参数返回到原来的JSP中,通过转发
request.setAttribute("result", "<p>请求类型:"+method+ ", 用户:"+user+" , 密码:"+pwd+"</p>");
//转发
request.getRequestDispatcher("/TestAttrbuteAndParameter.jsp").forward(request, response);
}
这里注意,servlet中做了一次转发,转发给了原JSP,在JSP中getAttribute()。符合该方法的作用范围,因为JSP就是一个servlet
输入用户和密码,得到结果:
这个例子可以看出两者的使用方式和范围了。
同时,这里引出另一个问题,转发以及重定向,下面说下这两者的区别:
1)请求转发时,页面的地址不变,重定向时,页面地址变为了重定向的目标地址。
2)转发的整个过程客户端只有一次请求, 而重定向是发生了两次请求。
3)重定向可以重定向到任何网页上,而转发只能是本站网点。
4)调用方式的不同
转发的servlet代码
request.getRequestDispatcher("/t1.jsp").forward(request, response);
JSP中转发的写法
<jsp:forward page="apage.jsp" />
重定向的代码
response.sendRedirect("apage.jsp");//重定向到apage.jsp
5)框架当中常使用是转发,两者在不同情况下必须使用其中的一种 ,并非可选择的问题。