Java后台之路(09)-Servlet

来源:互联网 发布:学习ios软件 编辑:程序博客网 时间:2024/05/17 08:46

请求和响应简述

通过我们之前对Servlet的了解可以知道,doGet(),doPost()等系列方法对我们尤为重要,事实上,对于Servlet而言,我们的重心就是写好doXxx()系列方法。

我们知道这些doXxx()方法是用来接收客户端请求以及处理响应的,我们从何来处理这些呢?在doXxx()系列方法我们一眼可以看到HttpServletRequest,HttpServletResponse两个类型的变量。

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}

每一次请求包含请求和响应,request代表请求,respect代表响应。我们以HttpServlet为例。我们如果需要获取客户提取的数据,只需要处理HttpServletRequest;若要向客户端输出数据,需要处理HttpServletResponse。


响应HttpServletResponse简单使用

public class HelloServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        // 返回数据的编码格式        resp.setCharacterEncoding("UTF-8");        resp.setContentType("text/html;chartset=UTF-8");        // 在页面显示一个值        PrintWriter write = resp.getWriter();        write.write("戚继光");        // 响应,让页面5s后跳转到博客首页        resp.addHeader("Pragma", "no-cache");        resp.addHeader("Cache-Control", "no-cache");        resp.addHeader("Expirse", "0");        resp.addHeader("refresh", "5;url=http://blog.csdn.net/weixin_36244867?viewmode=contents");          }}

我们在浏览器中键入:

localhost:8080/MyServlet/servlet/HelloServlet

首先页面输入了“戚继光”,5s后跳转到了博客首页;

我们设置重定向还有下面的方式:

resp.sendRedirect("http://blog.csdn.net/weixin_36244867?viewmode=contents");

不仅如此,我们还能向客户端返回字节流即文件,下面用返回图片来举例。


响应HttpServletResponse下载文件

将资源文件读到resp对象上,看代码。

protected void doGet(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException {    String path = getServletContext().getRealPath("/girl.jpg");    FileInputStream inputStream = new FileInputStream(path);    ServletOutputStream outputStream = resp.getOutputStream();    int len = 0;    byte[] b = new byte[1024];    while( (len=inputStream.read(b))!=-1 ){        outputStream.write(b, 0, len);    }    outputStream.close();    inputStream.close();}

响应HttpServletResponse细节

  • getOutputStream()和getWriter()分别用于得到输出字节流和输出字符流的ServletOuputStream、Printwriter。getOutputStream()和getWriter()这两个方法互相排斥,调用了其中任意一个方法后就不能再调用另一方法;否则系统抛出异常;
  • 在Servlet中向ServletOutputStream对象或PrintWriter对象写入的数据将被Servlet引擎(如Tomcat)从response里面获取,然后Servlet引擎再将这些数据当作响应消息的正文且与响应状态行和响应头组合并输出到客户端。这也就是说:并不是response将响应消息传递给了客户端,而是Servlet引擎将响应消息封装到了response中再由Servlet引擎传递给客户端;
  • Serlvet的service()结束后,Servlet引擎将检查getWriter()或getOutputStream()返回的输出流对象是否已经调用过close();如果未关闭则Servlet引擎将调用close()关闭该流对象,如果已经关闭则不作处理。

请求HttpServletRequest简单使用

HttpServletRequest代表了客户端请求,客户端向服务器请求的所有数据都在HttpServletRequest里,我们来归纳一下常用方法。

  • getRequestURL(),返回客户端发出请求时的完整URL;
  • getRequestURI(),返回请求行中的资源名部分;
  • getContextPath(),返回请求的上下文路径;
  • getQueryString(),返回请求行中的参数部分;
  • getParameter(),返回参数中的具体值;
  • getRemoteAddr(),返回发出请求的客户端的IP地址;
  • getRemoteHost(),返回发出请求的客户端的完整主机名;
  • getRemotePort(),返回客户端所使用的网络端口号;
  • getMethod(),返回客户端使用的请求方式;
  • getHeaderNames(),返回此请求包含的所有头的名称;
  • getHeader(),返回指定的请求头的值;

我们根据之前学到的JDBC和Servlet做了一个demo项目,实现登陆注册功能,代码在这里。


网页重定向

重定向的两种方式:

// 方式1,利用HttpServletResponse对象response.sendRedirect(String location);// 方式2,setHeader()组合setStatus()使用String site = "http://www.runoob.com" ;response.setStatus(response.SC_MOVED_TEMPORARILY);response.setHeader("Location", site); 

重定向和请求转发的区别

各自的实现方式:

  • 利用response.sendRedirect()实现请求的重定向;
  • 利用request.getRequestDispatcher().forward()实现请求的转发;

他们的区别在于:

  • 重定向时浏览器中的地址栏会发生变化,但是请求转发时浏览器中地址栏不会发生改变。从本质上来讲:重定向是两次不同的请求,而请求转发只向服务端的发送了一次请求由服务端的内部实现请求的跳转。
  • 重定向可以跳转到应用的外部,而重定向的范围只能是应用的内部;
  • 请求转发可利用request.setAttribute()将数据传递到下一个Servlet且下一个Servlet可用request.getAttribute()取出数据;但是重定向不可以也没有道理这么做。至于为什么,请参考第一点。

原创粉丝点击