HTTP请求结构:
- 请求行:请求方法,请求url,http协议版本
- 请求头:语言,浏览器,操作系统环境,数据长度...
- 请求体:post请求发送的参数
HTTP响应结构:
- 响应行:报文协议和版本,状态码及描述信息
- 响应头:Content-Type:text/html
- 响应体:浏览器显示的信息,如HTML
状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
Content-Type的作用:
决定浏览器采用何种方式对响应体进行处理
response.setContentType("text/html;charset=utf-8");
...
response.setContentType("text/plain;charset=utf-8");
请求转发和重定向
多个Servlet(jsp)之间跳转有两种方式:
- request.getRequestDispatcher.forward():请求转发,是服务器跳转,只会产生一次,语句:request.getRequestDispatcher("/direct/index").forward(request, response);
- response.rendRedirect():响应重定向,是浏览器的跳转,会产生两次请求。语句是:response.sendRedirect("/servlet-advance/direct/index");
请求转发代码:
CheckLoginServlet.java
package com.ulikeme.direct;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CheckLoginServlet
*/
@WebServlet("/direct/check")
public class CheckLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CheckLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("用户登录成功");
request.setAttribute("username", "admin");
// 请求转发
request.getRequestDispatcher("/direct/index").forward(request, response);
// 响应重定向,需要增加contextPath
// response.sendRedirect("/servlet-advance/direct/index");
}
}
IndexServlet.java
package com.ulikeme.direct;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class IndexServlet
*/
@WebServlet("/direct/index")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public IndexServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String username=(String)request.getAttribute("username");
response.getWriter().println("<h1>this is index,my name is "+username+"</h1>");
}
}
访问:http://localhost:9999/servlet-advance/direct/check
修改上述代码实现,响应重定向:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("用户登录成功");
// 请求转发
// request.getRequestDispatcher("/direct/index").forward(request, response);
// 响应重定向,需要增加contextPath
response.sendRedirect("/servlet-advance/direct/index");
}
访问:http://localhost:9999/servlet-advance/direct/check
设置请求的自定义属性
- 设置请求属性:request.setAttribut(属性名,属性值);
- 获取请求属性:Object attr=request.getAttribute(属性名);