0%

Servlet实现类HttpServlet的使用

2017年9月7日 上午8:40

概述

这个类的作用是处理响应和请求
主要是是在service()方法中实现
最后附录三种有源码


接受请求方式


其中主要使用

  1. doGet:接受get请求
  2. doPost:接受post请求
  3. service:接受所有请求 get+ post

MyServlet3.class 继承自httpServlet,实现了三个接受请求的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.shanxi.weixin.servlet;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet3 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//servlet 四大作用域对象之一。他是servlet上下文对象
ServletContext application = getServletContext();
//getInitParameter(java.lang.String name)
String value = application.getInitParameter("param-name");
System.out.println(value);

}

// /*
// * 接收Get请求的方法
// */
// @Override
// protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("doGet...");
// }
// /*
// * 接收Post请求的方法
// */
// @Override
// protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("doPost...");
// }

}

两种响应方式:附录代码

请求转发:

替换方式 xml 404
情景理解

  1. 老公的手机屏幕亮了,我一看是一条短信,随便一看,发现语言特别暧昧,于是我猜测是小三。于是,我果断的拿起手机,回了一条短信“你在…宾馆等我,我马上过去”。然后把这个短信删了,我就出发了。小三不知道是我,所以她高兴的来了。我一见它就是一顿暴打,爽!
  2. 这里的小三就是浏览器,她找的其实是我老公,但是最后他的请求让我处理了。重要的是她从头到尾不知道,这就是请求转发
    转发

实现

1
req.getRequestDispatcher("/index.jsp").forward(req,res);

注:这里的路径直接替代web.xml中的请求文件

重定向

  1. 重定向是服务器对客户端响应了本次请求,响应状态吗是302,客户端接收到响应码之后,直接再次发送一个新的请求到重定向的location上。(不受用户控制)
  2. 重定向实际上是两次请求

实现1

1
res.sendRedirect("/servletDemo/index.jsp");

注:这里要写从根路径开始
实现2

1
2
response.setStatus(302);
response.setHeader("location", "/ResponseDemo/ResponseDemo13");

实现1是实现2的封装
参考:Servlet实现重定向的两种方式 - 张昊亮 - 博客园


如何处理get请求的乱码


解决方法

1
2
3
4
String name = req.getParameter("name");
byte[] bytes = name.getBytes("iso-8859-1");
name = new String(bytes, "utf-8");
System.out.println(name);

步骤解析:

  1. 获取url中的参数保存在name中,此时name输出是乱码
  2. 所以,我们把字符串类型的name转换成字节型保存在byte[]数组中,这种最原始的方式
  3. 然后对byte[]数组重新选择格式进行解码

:默认浏览器的编码格式是iso-8859-1,要转换成的格式是我们当前项目的格式,这里是utf-8


附录一:
res.sendError(404,"你请求的资源在我这,我就不让你看!");

附录二:
当一下两种相应方式同时存在时,会报错

1
2
req.getRequestDispatcher("/index.jsp").forward(req,res);
res.sendRedirect("/servletDemo/index.jsp");

附录三:public class MyServlet4 extends HttpServlet完整源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.shanxi.weixin.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet4 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
/*
* HttpServletRequest 请求对象
*/
String path = req.getContextPath();
System.out.println(path);
String requestURI = req.getRequestURI();
System.out.println(requestURI);
Enumeration<String> names = req.getParameterNames();
String name = req.getParameter("name");
System.out.println(name);
byte[] bytes = name.getBytes("iso-8859-1");
name = new String(bytes, "utf-8");
System.out.println(name);
// while(names.hasMoreElements()){
// String name = names.nextElement();
// System.out.println(name+" "+req.getParameter(name));
// }

//服务器响应客户端的两种响应方式: 请求转发 重定向
/*
* 请求转发实际上是一次请求在进行传递
* 重定向是服务器对客户端响应了本次请求,响应状态吗是302,客户端接收到响应码之后,直接再次发送一个新的请求到重定向的location上。(不受用户控制)
* 重定向实际上是两次请求
*/
//req.getRequestDispatcher("/index.jsp").forward(req,res);
//res.sendRedirect("/servletDemo/index.jsp");

/*
* HttpServletResponse 响应对象
*/
res.sendError(404,"你请求的资源在我这,我就不让你看!");


}

}