Java复习1:Request
1. HttpServlet概述
创建一个Servlet时会覆盖service()方法,或者doGet(),doPost()方法,这些方法都有两个参数,一个是代表请求的request,另一个是代表响应的response。具体为HttpServletRequest,这是一个功能强大的接口。
//创建一个Servlet(里头的方法有request和response两个参数)
public class LineServlet extends HttpServlet {
//service()方法
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(arg0, arg1);
}
//doGet()方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//doPost()方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
2. request的运行流程
一次完整的用户网页访问包括:(在Java web project中)
- 从客户端发送http请求
- tomcat内核解析请求的资源,将请求信息封装在request对象中,并创建一个response对象
- 相应的Servlet接收request和response,并调用相应的doGet()/doPost()方法
- Servlet返回response给tomcat内核
- tomcat内核从response中获取设置的内容组装一个Http响应(响应行,响应头,响应体)
3. 通过抓包工具抓取Http请求
- 请求行
请求方式:GET/POST 请求资源:URI Http协议版本- 请求头:键值对的形式,是浏览器自动封装的,这些是浏览器要告诉服务器的一些信息
- 请求体:请求参数(POST提交的请求参数,GET提交的参数跟在url地址的?后面)
4. 通过request获得请求行
参考代码
//获得请求行的请求方法
String method = request.getMethod();
//获得请求行的请求资源
String requestUri = request.getRequestURI(); //URI:统一资源标识符
StringBuffer requestUrl = request.getRequestURL(); //URL:统一资源定位符,适用于网络资源
String contextPath = request.getContextPath(); //Web应用的名称
String queryString = request.getQueryString(); //get提交url地址后的参数字符串
String remoteAddr = request.getRemoteAddr(); //访问的客户端的IP地址
5. 通过request获得请求头
参考代码
注意:referer头表示执行该访问的来源,做防盗链
String header = request.getHeader("User-Agent"); //指定的请求头
Enumeration<String> headerNames = request.getHeaderNames(); //所有请求头的名称
Enumeration<String> headers = request.getHeaders(); //所有请求头
6. 通过request获得请求体
参考代码
- 注意:get请求方式同样能通过以下方法获取参数
- 请求体中的内容是通过post提交的请求参数,格式为key1=value1&key2=value2…
例如:
key | value |
---|---|
username | [zhangsan] |
password | [123] |
hobby | [football, basketball] |
//获得单个表单值
String username = request.getParameter("username");
//获得多个表单的值
String[] hobbies = request.getParameters("hobby");
//获得所有的请求参数,封装到Map<String, String[]>中
Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry: map.entrySet()) {
System.out.println("---");
System.out.println(entry.getKey());
for(String str: entry.getValue()) {
System.out.println(str);
}
System.out.println("---");
}
7. request的其他功能
7.1 request是一个域对象
不要忘记request对象也是一个存储数据的区域对象,所以也有这些方法:setAttribute(String name, Object obj), getAttribute(String name), removeAttribute(String name)
7.2 request完成请求转发
参考代码
- 请求转发:服务端跳转
- 重定向:客户端跳转,302
//重定向
response.sendRedirect(request.getContextPath() + "/重定向地址");
//请求转发
RequestDispatcher dispatcher = request.getRequestDispatcher("/转发地址");
dispatcher.foward(request, response);
一些问题:
-
ServletContext域和Request域的生命周期比较?
ServletContext | Request | |
---|---|---|
创建 | 服务器启动 | 访问时 |
销毁 | 服务器关闭 | 响应结束 |
域的作用范围 | 整个web应用 | 一次请求中 |
-
转发和重定向的区别
- 重定向实际客户端发出两次请求,转发只有一次请求
- 重定向地址栏url改变,转发地址栏url不变
- 重定向可以访问外部网站,转发只能访问内部资源
- 转发性能要优于重定向
-
客户端地址和服务器端地址的写法区别
- 客户端地址:外部地址,需要完整的写上web应用名称
- 服务器端地址: 内部地址,服务器内部资源的跳转地址,不需要完整的协商web应用的名称
8. 总结
-
request获得行的内容 request.getMethod() request.getRequestURI()
request.getRequestURL() request.getContextPath()
request.getRemoteAddr() -
request获得头的内容 request.getHeader(name)
-
request获得体(请求参数) String request.getParameter(name)
Map<String,String[]> request.getParameterMap(); String[]
request.getParameterValues(name); 注意:客户端发送的参数 到服务器端都是字符串 -
获得中文乱码的解决: post:request.setCharacterEncoding(“UTF-8”);
get: parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”); -
request转发和域 request.getRequestDispatcher(转发的地址).forward(req,resp);
request.setAttribute(name,value) request.getAttribute(name)