JavaWeb(三) —-Servlet处理HTTP响应,请求

Java 发表评论


Servlet处理HTTP响应

设置响应状态行

状态行:HTTP协议,状态码,状态描述。

HTTP状态码:
1. 100-199 :表示信息性代码,标示客户端应该采取其他动作,请求正在进行。
2. 200-299 :表示客户请求成功。
3. 300-399 :表示用于已经移走的资源文件,指示新的地址
4. 400-499 :表示由客户端引发的错误。
5. 500-599 :表示由服务器端引发的错误。

设置状态码

使用HttpServlet的setStatus();

使用HttpServlet的sendError(状态码,状态描述);

设置状态码重定向,请求资源不存在,再次请求到另外的资源:

response.setStatus(302);
response.setHeader("Location","index.jsp");

也可以用:

response.sendRedirect("http://127.0.0.1:8080//lovobook/bar.html")

把请求重定向到一个完全不同的url上(选择别的服务器端程序来处理请求)

重定向:
1. 重定向的状态码是302,表示资源被移走,重新请求新的资源。
2. 重定向是客户端发起的2次请求。
3. 调用sendRedirect方法可以不用设置状态码,会自动把状态码设置为302

设置响应头

HttpServletResponse 对象用于操作响应的响应头。

1.设置响应内容的类型MIME类型

什么是MIME类型:

告诉浏览器服务器发送回去的数据类型是什么,客户端启动的相应的应用程序来处理响应内容。

response.setContentType("text/html");  
response.setContentType("image/gif");   
            ......

2.设置响应头

通过响应头设置MIME类型:

/*类似于 <meta charset = utf-8>*/

esponse.setHeader("Content-Type","text/html;charset=utf-8");

自动刷新功能:
/后面数字的单位是秒,不是毫秒了/

response.setHeader("refresh","1")
response.setHeader("refresh","1;index.jsp");在一秒后跳转

控制数据是否缓存:

response.setHeader("Pragma","NO-cache");
response.setHeader("Cache-Control","No-cache");

设置过期时间(缓存到什么时候):

response.setDateHeader("Expries",System.currentTimeMillis());

3.设置响应消息体

HttpServletResponse对象负责将信息返回给客户端

HttpServletResponse对象只产生一个空的http响应。

传回自定义的内容需要getWriter()或者

getOutputStream()方法。

-传送普通文本

-传送二进制内容


传送普通文本:

//tomcat默认响应客户端解析的时候编码集是ISO-8859-1    
response.setContentType("text/html");
PrintWriter out = response.getWriter();

out.print();
out.write();
//write(),print()方法区别:
//共同点:两者都不会刷新页面,只在原来的页面上写数据。两个方法都是重写了Writer类里面的write方法。
//不同点:print方法可以将各种不同的数据转换为字符串输出,write方法只能操作字符,或者字符数组,字符串,只能操作和字符串相关的


//输出中文浏览器
//设置传输过程中编码格式是utf-8,一般写在最上面
respons.setCharacterEncoding("utf-8");

传送二进制:

response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

//获取到输出流对象
OutputStream out = response.getOutputStream();
//将字符串转换成字节数组
byte[] ca  = str.getBytes();
out.write(ca);

文件下载:

protecter void doGet(HttpServletRequest req,HttpServletResponse resp)


throws ServletException,IOException{

    resp.setCharacterEncoding("utf-8");
    resp.setContentType("image/jpeg");

    //获取到文件要下载的路径,通过上下文对象获取到文件的物理路径
    String path = this.getServletContext().getRealPath("/image/1.jpg");

    //设置响应头,控制浏览器打开下载框
    resp.setHeader("Content-disposition","attachment;fileName=1.jpg")

    {
    如果是中文的路径:操作图片的中文名字也要转换为字节数组,还要保持编码级和服务器一致。

    String path = this.getServletContext().getRealPath("/image/高圆圆.jpg");

    resp.setHeader("Content-disposition","attachment;fileName="+new String(path.getBytes("utf-8"),"ISO8859-1"))    

    }


    //获取到图片的二进制流

    InputStream in = new FileInputStream(path);

    //创建一个二进制流

    OutputStream out  =  resp.getOutputStream();

    //创建一个缓冲区

    int len = 0 ; 

    byte[] by = new byte[1024]

    while((len = in.read(by))!= -1){

        out.write(by,0,len);

    }
}

通过字符流操作二进制文件,有可能出现内容丢失

Servlet处理HTTP请求

HttpServletRequest 对象主要用户获取客户端发送过来的请求头,状态行,空行,消息体

GET/POST 提交方法

GET方法提交

  1. 地址栏直接输入服务器资源
  2. 通过js直接访问
  3. 超链接访问默认也是GET提交

用于获取到服务器的资源。

POST提交

主要是用于传输数据。客户端向服务器发送数据,一般用post。可以发送文本数据,二进制数据。

特征 GET方法 Post方法
提交数据类型 文本 文本、二进制文本
提交数据长度 不超过255字符 没有限制
提交数据可见性 作为URl地址的一部分显示 作为请求的消息体,不可见
提交数据缓存 缓存在浏览器URL历史状态中 不会被浏览器缓存

何时使用GET/POST方法:

  1. 请求一个静态页面或者图形文件时用GET方法
  2. 发送大数据的时候,使用POST方法
  3. 上传文件时,使用POST方法
  4. 发送用户名,密码或其他保密信息的时候用POST方法

方法操作

获取请求行

http 传送的请求行的内容全部封装到了request对象,可以直接调用方法获取到请求行的内容

1.获取到客户端请求的方法

String method = request.getMethod();

2.获取到请求的URL地址

String URL = request.getRequestURL().toString();

String URI = request.getRequestURI()

URL:统一资源定位符(实实在在的全路径)

URI:统一资源标志符

3.获取到请求过程中附带的参数

String qu = request.getQueryString();

4.获取到客户端的IP

String ipstr = request.getRemoteAddr();

5.获取到服务器的端口

int port = request.getLocationPort();

获取请求头

1.获取到请求头

String agent = request.getHeader("User-Agent");
传入一个请求头名字

2.获取到所有的请求头

Enumeration num = request.getHeaderNames();

3.获取到日期类型的请求头

Date date = request,getDateHeader(arg0);

获取消息体

request封装了客户端传过来的数据

在POST提交的方法内部:

要在开始设置编码集

request.setCharacterEncoding("utf-8");

1.获取到消息体

String username  = request.getParameter("username");

2.获取到客户端传入的多个数据(eg:复选框)

String[] s = request.getParameterValues("like")

注意:提交中文一般采用POST,GET提交默认乱码,需要自己处理编码集。

String name = reques.getParameter(“uesename”);
String newName = new String(name.getBytes(“ISO8859-1”),”utf-8”);

请求派发(内部派发)

  1. 每个客户的请求可以传递给很多Servlet以及web应用程序中的其他资源
  2. 整个过程完全是在服务端完成的
  3. 不需要任何客户端浏览器的行为
  4. 不需要在客户端浏览器和服务器端之间传递特殊信息
  5. 通过javax.servlet.RequestDispatcher对象实现

    RequestDispatcher rd = request.getRequestDispatcher(“html/succes.html”);
    /指定跳转资源,如果是servlet就直接写名字就可以了/
    rd.forward(request,response);
    /客户端还是原来的地址,不会改变为新的地址/
    rd.include(request,response);
    /是把资源的控制权移交给下一个资源,当下一个资源操作完毕后,最后将控制权再回收到本资源中,最后响应客户端的也是本资源/

当前请求派发后,这个资源就将控制权移交给下一个资源了,就没有响应的能力了。
请求派发默认调用dopost()

请求派发和重定向的区别:
1. 请求派发的状态码是307,重定向是302.
2. 请求派发是在服务器端完成的,不影响客户端,地址栏不会变化。重定向是客户端来完成,地址栏会变化。
3. 请求派发只能在本服务器完成,重定向是可以访问其他服务器的资源。

注意:如果是客户端提交过来的内容 /JavaWeb04/xxxxx 前面的第一个/只能到达webapps ,所以要加上工程名字。

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *