设置了编码后,没有做任何手工转换,成功拿到数据
当然也有另一种改服务器编码的方式。设置Tomcat的访问该端口时的编码为页面的编码,这种改法是随着页面的编码而变
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
设置编码为UTF-8
request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name");
再次访问
- 手写超链接如果附带中文参数问题,要URL重写,在JSP博客中会讲到
- 总结:
- post方式直接改request对象的编码
- get方式需要手工转换编码
- get方式也可以修改Tomcat服务器的编码,不推荐,因为会太依赖服务器了!
- 提交数据能用post就用post
实现转发
之前讲过使用response的sendRedirect()可以实现重定向,做到的功能是页面跳转,使用request的getRequestDispatcher.forward(request,response)实现转发,做到的功能也是页面跳转,他们有什么区别呢?现在我先来说下转发
- 代码如下所示
//获取到requestDispatcher对象,跳转到index.jsp RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp"); //调用requestDispatcher对象的forward()实现转发,传入request和response方法 requestDispatcher.forward(request, response);
访问Servlet111
- 上面已经说了,可以通过sendRedirect()重定向可以在资源尾部添加参数提交数据给服务器。那么转发能不能提交数据给服务器呢?
- 答案明显是可以的,并且使用这种方法非常频繁
- 在讲ServletContext的时候,曾经说过Servlet之间可以通过ServletContext实现通讯,ServletContext也能称之为域对象。而request也可以称之为域对象,只不过ServletContext的域是整个web应用,而request的域仅仅代表一次http请求
- 下面我们来使用request实现Servlet之间的通讯,Servlet111代码
//以username为关键字存zhongfucheng值 request.setAttribute("username", "zhongfucheng"); //获取到requestDispatcher对象 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Servlet222"); //调用requestDispatcher对象的forward()实现转发,传入request和response方法 requestDispatcher.forward(request, response);
Servlet222代码
//获取到存进request对象的值 String userName = (String) request.getAttribute("username"); //在浏览器输出该值 response.getWriter().write("i am :"+userName);
访问Servlet111看下效果
- 如上图所示,Servlet222成功拿到了request对象在Servlet111存进的数据。
- 现在问题又来了,我们可以使用ServletContext和request实现Servlet之间的通讯,那么我们用哪一种呢?一般的原则:可以使用request就尽可能使用request。因为ServletContext代表着整个web应用,使用ServletContext会消耗大量的资源,而request对象会随着请求的结束而结束,资源会被回收。使用request域进行Servlet之间的通讯在开发中是非常频繁的。