Java Web HttpServlet
HttpServlet设计Servlet之初,考虑到互联网中使用的协议不仅仅是http协议,所以为了支持更多的协议,Servlet使用接口的设计思想GendericServlet,Servlet接口的子接口,一个通用的ServletHttpServlet继承自GendericServlet,就是和http协议相关的Servlet,专门用来处理http协议的请求和响应使用HttpServlet类,就
HttpServlet
设计Servlet之初,考虑到互联网中使用的协议不仅仅是http协议,所以为了支持更多的协议,Servlet使用接口的设计思想
GendericServlet,Servlet接口的子接口,一个通用的Servlet
HttpServlet继承自GendericServlet,就是和http协议相关的Servlet,专门用来处理http协议的请求和响应
- 使用HttpServlet类,就不需要重写service方法,在HttpServlet中重写doGet、和doPost方法即可
- 如果是get请求,那么就重写doGet,是post就重写doPost
Servlet2.5和Servlet3.0:
- 2.5:Servlet、过滤器Filter、监听器Listener的声明必须使用web.xml
- 3.0:新增注解的支持,用于简化Servlet、过滤器、监听器的配置,所以从3.0开始web.xml不再是必选的。
使用注解@WebServlet,该注解中value和urlPatterns都可以用来指定访问该Servlet的url,同时只能使用一个,都是一个Sting[]类型的,所以一个Servlet可以为它定义多个url
HttpServletRequest接口
继承至ServletRequest接口,获取客户端发送的请求数据,它是与Http协议相关的Request,代表一个请求
- HttpServletRequest接口对象是tomcat容器提供的,所以我们不需要自己创建
- request对象中获取的数据就是请求报文中的请求行、请求头和请求体
获取请求行信息的方法:
返回值 | 方法名 | 说明 |
---|---|---|
String | getMethod() | 获取请求的方式(get/post) |
String | getRequestURL() | 获取请求路径和参数 |
String | getQueryString() | 获取请求中的参数 |
String | getContextPath() | 获取web应用程序的名称 |
获取请求头信息的方法:
返回值 | 方法名 | 说明 |
---|---|---|
String | getHeader(String name) | 获取请求头中指定key的value |
Enumeration | getHeaderNames() | 获取所有请求头的key |
获取请求参数信息的方法:
(get请求方式的参数信息在url后,post请求方式放在请求体中)
返回值 | 方法名 | 说明 |
---|---|---|
String | getParameter(String name) | 获取请求中指定name 的值 |
String[] | getParameterValues(String name) | 获取请求中指定name 的所有值,针对复选框这种一个key对应多个value |
Map< String,String[]> | getParameterMap() | 获取请求中所有参数,参数名为key,对应值为value存入Map集合中 |
示例:
在JavaWeb项目中web目录下创建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>javaWeb首页</title>
</head>
<body>
<h2>welcome to html</h2>
<form action="request1" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
爱好:<input type="checkbox" name="hobby" value="eat"/>吃
<input type="checkbox" name="hobby" value="sleep"/>睡
<input type="checkbox" name="hobby" value="code"/>玩<br>
<input type="submit" value="post提交"><br>
</form>
<form action="request1" method="get">
<input type="submit" value="get提交">
</form>
</body>
</html>
准备一个Servlet:
@WebServlet(urlPatterns = {"/request1"})
public class HttpServletRequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------------获取请求行信息--------------");
System.out.println("获取请求方式"+req.getMethod());
System.out.println("获得URI"+req.getRequestURI());
System.out.println("获得URL"+req.getRequestURL());
System.out.println("获得get请求参数"+req.getQueryString());
System.out.println("获得web根路径"+req.getContextPath());
System.out.println("-------------获取请求头信息--------------");
Enumeration<String> e = req.getHeaderNames();
while (e.hasMoreElements()){
String key = e.nextElement();
System.out.print(key+":");
String value = req.getHeader(key);
System.out.println(value);
}
System.out.println("-------------获取get请求中的参数--------------");
//Tomcat8.5之后可以自动处理中文乱码问题
System.out.println(req.getParameter("user"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------------获取请求体信息--------------");
//修改request缓冲区中的编码类型
req.setCharacterEncoding("UTF-8");
System.out.println("获取username的值"+req.getParameter("username"));
System.out.println("获取一个复选框信息"+Arrays.toString(req.getParameterValues("hobby")));
System.out.println("获取表单全部信息");
Map<String,String[]> map = req.getParameterMap();
for (Map.Entry<String,String[]> e:map.entrySet()){
System.out.println(e.getKey()+Arrays.toString(e.getValue()));
}
}
}
Request接收表单请求中数据中文乱码:
- post请求:
- post方式提交的数据在请求体中,request对象接收到数据后,放入缓冲区,而request缓冲区的编码方式为ISO-8859-1
- 设置缓冲区编码格式:
req.setCharacterEncoding("UTF-8");
- get请求:
- get方式提交的数据都在url的后面(以 ?key1=value1&key2=value2···的方式)
- 当数据存在中文时,在地址栏中其实就已经进行过一次url编码了
- 在Tomcat8.5版本之后,tomcat可以自动处理get请求中中文乱码的问题
- 如果使用之前的版本,可以使用ISO-8859-1的方法获取,在使用UTF-8转码得到
HttpServletResponse接口
继承至ServletResponse接口,返回数据到客户端
当服务器获取request请求后,经过一些处理,再把服务器中的数据返回给客户端浏览器,这就是响应
- HttpServletResponse接口对象也是由tomcat容器创建和管理的
设置响应行的方法:
返回值 | 方法名 | 说明 |
---|---|---|
void | setStatus(int code) | 设置相应的状态码 |
设置响应头的方法:
返回值 | 方法名 | 说明 |
---|---|---|
void | addHeader(String key,String value) | 添加一个响应头,值为String类型 |
void | addIntHeader(String key,int value) | 添加一个响应头,值为int类型 |
void | addDateHeader(String key,long i) | 添加一个响应头,值为日期类型 |
void | setHeader(String key,String value) | 设置一个响应头,值为String类型 |
void | setIntHeader(String key,int value) | 设置一个响应头,值为int类型 |
void | setDateHeader(String key,long i) | 设置一个响应头,值为日期类型 |
(add开头的方法,可以实现一个key对应多个value的情况(key相同,继续添加),set开头的方法,针对一个key对应一个value(key相同,会替换掉之前的))
设置响应体的方法:
返回值 | 方法名 | 说明 |
---|---|---|
PrintWriter | getWriter() | 返回一个打印流,写出数据到浏览器 |
- PrintWriter中的方法:
- writer(···):输出数据到浏览器上,字符串没有区别,但是如果输入整数,则是ASCII码值
- print(···):输出数据到浏览器上,无论什么类型都是原样输出
字符流输出乱码:
- response缓冲区编码也是ISO-8859-1
- 设置response缓冲区的字符集和浏览器的编码格式一致即可
resp.setCharacterEncoding("utf-8")
:设置响应内容的编码方式resp.setContextType("text/html;charset=utf-8")
:设置浏览器打开页面时使用的字符集
示例:
在浏览器中访问response1
@WebServlet({"/response1"})
public class HttpServletResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//规定是使用的字符集
resp.setContentType("text/html;charset=utf-8");
//设置状态码为200
resp.setStatus(200);
//添加响应头信息
resp.setHeader("a","aaa");
resp.addHeader("a","a22");
resp.addIntHeader("a",123);
resp.addDateHeader("dateA",88888888L);
PrintWriter out = resp.getWriter();
//浏览器中会显示一个d
out.write(100);
//显示100
out.print(100);
}
}
更多推荐
所有评论(0)