Servlet
- HttpServletRequest接口
①该接口是ServletRequest接口的子接口,封装了HTTP请求的相关信息,由Servlet容器创建其实现类对象并传入service(ServletRequest req, ServletResponse res)方法中。以下我们所说的HttpServletRequest对象指的是容器提供的HttpServletRequest实现类对象。
②HttpServletRequest对象的主要功能有
- 获取请求参数
[1]什么是请求参数?就是浏览器向服务器端提交的数据
[2]浏览器端如何发送请求参数
○附着在URL地址后面
http://localhost:8989/MyServlet/MyHttpServlet?userId=20 |
○表单提交
<form action="MyHttpServlet" method="post"> 你喜欢的足球队<br /><br /> 巴西<input type="checkbox" name="soccerTeam" value="Brazil" /> 德国<input type="checkbox" name="soccerTeam" value="German" /> 荷兰<input type="checkbox" name="soccerTeam" value="Holland" /> 中国<input type="checkbox" name="soccerTeam" value="China" /> 法国<input type="checkbox" name="soccerTeam" value="French" /> 意大利<input type="checkbox" name="soccerTeam" value="Italy" /> <br /><br /> <input type="submit" value="提交" /> </form> |
[3]使用HttpServletRequest对象获取请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //一个name对应一个值 String userId = request.getParameter("userId"); System.out.println("userId="+userId); } |
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //一个name对应一组值 String[] soccerTeams = request.getParameterValues("soccerTeam"); for(int i = 0; i < soccerTeams.length; i++){ System.out.println("team "+i+"="+soccerTeams[i]); } } |
[说明:其实在实际使用中,很少将数据转发给一个Servlet,更多的是将数据转发给一个JSP在页面上显示——而JSP之所以能够接收到数据是因为JSP本质上也是一个Servlet。这是我们在后面要学习的内容。]
- 在请求域中保存数据:将数据保存在请求域中,可以以转发的方式发送给其他Servlet。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.将数据保存到request对象中 request.setAttribute("myName", "FengJie"); //2.转发到接收数据的Servlet request.getRequestDispatcher("/ReceiveServlet") .forward(request, response); } |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从request对象属性域中获取数据 String myName = (String) request.getAttribute("myName"); System.out.println("myName="+myName); } |
- 将请求转发给另外一个URL地址,参见[请求的转发与重定向]。
- 获取与HTTP请求相关的信息,在学习HTTP协议时讨论。
- HttpServletResponse接口
①该接口是ServletResponse接口的子接口,封装了HTTP响应的相关信息,由Servlet容器创建其实现类对象并传入service(ServletRequest req, ServletResponse res)方法中。以下我们所说的HttpServletResponse对象指的是容器提供的HttpServletResponse实现类对象。
②主要功能
- 使用PrintWriter对象向浏览器输出数据
//通过PrintWriter对象向浏览器端发送响应信息 PrintWriter writer = res.getWriter(); writer.write("Servlet response"); writer.close(); |
- 实现请求重定向,参见[请求的转发与重定向]。
- 请求的转发与重定向
- 请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛。
- 请求的转发
①Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部“转发”给其他Servlet程序继续处理。在这种情况下浏览器端只发出了一次请求,浏览器地址栏不会发生变化,用户也感知不到请求被转发了。
②转发请求的Servlet和目标Servlet共享同一个request对象[这么说似乎不是很准确,因为如果我们分别输出转发前和转发后request对象的hashCode值会发现其实它们并不相等——这说明它们严格的说并不是同一个对象——但至少它们之间是可以共享请求域数据的]。
③用现实生活中的例子来说明,请求的转发很像这样一种情景:顾客在餐厅点菜,告诉了服务器张曼玉,张曼玉告诉了厨师,厨师完成之后将菜品交给了服务员林青霞,林青霞再交给顾客。在这个过程中顾客只发出了一次请求,但这个请求是先后由两个服务员执行的。
④实现转发的API
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.使用RequestDispatcher对象封装目标资源的虚拟路径 RequestDispatcher dispatcher = request .getRequestDispatcher("/index.html"); //2.调用RequestDispatcher对象的forward()方法“前往”目标资源 //[注意:传入的参数必须是传递给当前Servlet的service方法的 //那两个ServletRequest和ServletResponse对象] dispatcher.forward(request, response); } |
- 请求的重定向
①Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源。这时浏览器会自动去访问这个新的资源的地址。整个过程无需用户操作的参与,但浏览器端发出的是两次请求,且浏览器地址栏会改变为新资源的地址。
②重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了。
③请求的转发是在服务器内部进行的,所以目标资源只能是当前Web应用内的其他组件;而重定向是让浏览器请求新的资源,所以没有这个限制。
④用现实生活中的例子来说明:有些餐厅点餐的方式是顾客先在第一个窗口付款,凭小票到下一个窗口取餐,在这个过程中顾客发出了两次请求。
⑤实现重定向的API
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.调用HttpServletResponse对象的sendRedirect()方法 //2.传入的参数是目标资源的虚拟路径 response.sendRedirect("index.html"); } |
- 作业
- Servlet的HelloWorld
要求:创建一个Java类,实现Servlet接口,然后从浏览器端访问这个Servlet。 |
- HttpServlet
要求:使用Eclipse自动创建一个Servlet,使用表单向这个Servlet发送数据,在Servlet中打印获取到的数据。 |
- 测试Servlet的生命周期方法,体会生命周期的含义,以及Servlet的工作过程。
- Servlet初始化参数
要求:在web.xml中创建Servlet的初始化参数,在Servlet中获取并打印。 |
- Web应用初始化参数
要求:在web.xml中创建整个Web应用的初始化参数,在Servlet中获取并打印。 |