网站更新的意义,邀约网站怎么做请柬,旅游网站建设项目策划书,wordpress卢松松模板板块一 Servlet编程#xff1a;第三节 HttpServletRequest对象全解与请求转发 一、什么是HttpServletRequest二、接收请求的常用方法三、请求乱码问题四、请求转发#xff1a;forward五、Request作用域getParameter和getAttribute的区别 在上一节中我们已经学习了完整的Servl… 板块一 Servlet编程第三节 HttpServletRequest对象全解与请求转发 一、什么是HttpServletRequest二、接收请求的常用方法三、请求乱码问题四、请求转发forward五、Request作用域getParameter和getAttribute的区别 在上一节中我们已经学习了完整的Servlet的实现方式、Servle的工作流程和生命周期但对于service(HttpServletRequest req, HttpServletResponse resp)中的两个重要形参还不了解我们所有的请求响应都是通过这两个形参来实现的。这节教程开始将详解Servlet的几大对象。 一、什么是HttpServletRequest
HttpServletRequest对象主要作用是用来接收客户端发送过来的请求信息。例如请求的参数、发送的头信息等都属于客户端发来的信息service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat封装好传递过来。
HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?从长远上讲:现在主要用的协议是HTTP协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承ServletRequest接口就可以在HttpServletRequest接口中,定义的方法很多,但都是围绕接收客户端参数的。我们只需直接在service() 方法中由对象传入过来,数据自然就已经被封装在对象容器中了这为我们所有请求的进行分析、处理提供了非常便捷的操作方式
二、接收请求的常用方法 实例 我们在helloServlet.java的service()方法中添上这些方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.service(req, resp);String userName req.getParameter();String url req.getRequestURI();System.out.println(获取请求的完整路径 url);String queryString req.getQueryString();//URL中后面的参数部分System.out.println(获取请求的参数字符串后面: queryString);String method req.getMethod();System.out.println(获取请求方式 method);String protocol req.getProtocol();System.out.println(获取当前协议版本 protocol);String webapp req.getContextPath();// 获取指定的参数System.out.println(获取项目站点名(对外访问路径) webapp);String namereq.getParameter(name);System.out.println(接受到的参数是 name \n);}启动服务器浏览器访问项目控制台输出 其中getParameter(...)是个很重要的方法它可以根据参数名称获取参数值
// 获取指定的参数System.out.println(获取项目站点名(对外访问路径) webapp);String namereq.getParameter(name);System.out.println(接受到的参数是 name \n);实例 当上面的代码在浏览器URL后面输入跟上参数nameToomyNike 控制台得
三、请求乱码问题
由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码不同版本的服务器不同的请求方式都会产生不一样的效果
Tomcat 8及以上Tomcat 7及以下GET请求不会乱码会乱码使用new String(request.getParameter(name).getBytes(ISO-8859-1),UTF-8);POST请求会乱码设置服务器编码格式request.setCharacterEncoding(UTF-8);会乱码设置服务器编码格式request.setCharacterEncoding(UTF-8);
主要是由于在解析过程中默认使用的编码方式为ISO-8859-1此编码不支持中文,所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置Request中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。
实例当前是Tomcat8.5 以POST请求提交给helloServlet.java的Servlet进行测试 我们在web目录下新建hello.jsp文件
写入以POST为提交方式的测试表单注意提交路径只需写为我们Servlet里WebServlet(/helloServlet)注释的路径即可之后遇到不再赘述
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitlehello/titleh1Tomcat with IDEA/h1/headbodyform actionhelloServlet methodpost输入参数input typetext namenamebutton提交/button/form/body
/html启动服务器在浏览器中访问hello.jsp输入中文参数点击提交跳转到helloServlet.java
控制台输出的内容是乱码 解决方式
方式一 设置服务器编码格式request.setCharacterEncoding(UTF-8);这种方式只针对POST有效且必须在接收所有的数据之前设定
实例 在helloServlet.java的service()中接受参数参数之前添上代码 req.setCharacterEncoding(UTF-8);String namereq.getParameter(name);System.out.println(接受到的参数是 name \n);便解决中文乱码问题了
方式二 在获取参数时使用String对象的方法new String(request.getParameter(name).getBytes(ISO-8859-1),UTF-8);该种方式对任何请求有效,是通用的。注意Tomcat8起,以后的GET方式请求是不会出现乱码的并且Tomcat8以上的GET请求强行使用此方法还会导致乱码
四、请求转发forward
请求转发是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
实现方式如下,达到多个资源协同响应的效果
request.getRequestDispatcher(url).forward(request, response);实例 在helloServlet.java中写入测试代码 //接收客户端请求的参数String namereq.getParameter(name);System.out.println(helloServlet接受到了参数 name);// 请求转发跳转到req.getRequestDispatcher( Servlet_do).forward(req,resp);在Servlet_do.java中写入接受参数的代码 String namereq.getParameter(name);System.out.println(Servlet_do接受到了参数 name);启动服务器在浏览器中访问helloServlet并传递参数提交后发现地址栏没有改变 控制台两个文件都打印了 说明参数在helloServlet中成功请求转发到了Servlet_do中 此时如果直接访问Servlet_do 会发现控制台接收不到参数 这是因为请求转发从始至终只有一个请求就是helloServlet的Request对象
五、Request作用域
在上面的代码中我们通过浏览器的地址栏或者jsp的表单提交了很多参数在Servlet中用Request对象的req.getParameter(name)方法接受了这些参数除了这个方法Request对象也可以在一个请求中传递数据作用范围:在一次请求中有效,即服务器跳转有效除了接受参数它还可以设置内容或者删除内容
// 设置域对象内容 第一个参数为名称第二个参数为内容
request.setAttribute(String name, Obj value);
// 获取域对象内容
request.getAttribute(String name);
// 删除域对象内容
request. removeAttribute(String name);实例 新建一个start.java作为我们发送参数的Servlet
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/start)
public class start extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置参数age的内容req.setAttribute(age,18);// 请求转发跳转到after.javareq.getRequestDispatcher( after).forward(req,resp);}
}新建一个after.java作为我们接受参数的Servlet
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/after)
public class after extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int age (int) req.getAttribute(age);System.out.println(接受到的参数为 age);}
}启动服务器在浏览器访问start以后控制台输出 就实现了一次Request作用域的完整范围,也就是一次请求转发的范围 从始至终只有一个请求发出也就只有start.java里的Request发出
getParameter和getAttribute的区别
那么好像req.getParameter(...)和req.getAttribute(...)都可以接受参数让人傻傻分不清楚它们的区别是什么 getParameter的过程如下图 getAttribute过程如下图 二者可以具体区分为这个表格
getParametergetAttribute获取的是客户端设置的数据获取的是服务器设置的数据永远返回字符串返回值是任意类型
既然parameter和attribute都是传递参数为什么不直接使用parameter呢
服务器端不能通过setParameter(key,value)来添加参数因为没有这个函数所以如果需要在服务器端进行跳转并需要想下个页面发送新的参数时则没法实现。是Attribute可以可以通setAttribute()将值放入到request对象然后在其他页面使用getAttribute获取对应的值这样就达到一次请求可以在多个页面共享一些对象信息parameter返回值是字符串意味着不能传递其他的对象如Map,List但是attribute则可以存放任意类型的Java对象
以上就是HttpServletRequest对象的所有基础内容了下一节我们将学习请求的兄弟HttpServletResponse响应对象