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中获取并打印。