HTTP请求
根据请求头的信息,可以判断不同的机器类型(比如电脑,手机,平板),进行不同的显示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().append("Served at: ").append(request.getContextPath());
String userAgent = request.getHeader("User-Agent");
response.getWriter().append("\n");
if(userAgent.indexOf("Windows")!=-1) {
response.getWriter().append("PC");
} else if(userAgent.indexOf("Android")!=-1 || userAgent.indexOf("iPhone")!=-1) {
response.getWriter().append("手机AP");
}
}
HTTP常见状态码
ContentType
可以用来解决 response 的中文乱码问题
请求转发与重定向
注意:请求转发,只和向服务器发送一次请求;响应重定向浏览器会和Tomcat有两次请求。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("用户登录");
request.setAttribute("username", "present");//设置属性名和属性值
//请求转发
request.getRequestDispatcher("/direct/index").forward(request, response);
//响应重定向,需要加上项目路径
response.sendRedirect("/request-structural/direct/index");
请求转发 和 响应重定向 只能使用一个
}
自定义属性 Attribute
request设置的属性请求转发后可以在另一个servlet中获取,但是如果是重定向就不可以了(因为重定向是两次请求)
Cookie
cookie默认关闭浏览器清除,可以手动设置他的存活时间
cookie.setMaxAge(12460*60); //设置cookie的存活时间,单位是秒
@WebServlet("/cookie/login")
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("尝试登录");
Cookie cookie = new Cookie("user","present");
cookie.setMaxAge(1*24*60*60); //设置cookie的存活时间,单位是秒
resp.addCookie(cookie);
resp.getWriter().println("login success!");
}
获取cookie
Cookie[] cookies = request.getCookies();
获取cookie的 key 和 value
cookie.getName()
cookie.getValue()
@WebServlet("/cookie/index")
public class Index2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
//或者 response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
if(cookies==null) {
response.getWriter().println("没有Cookie");
return;
}
String user=null;
for(Cookie cookie:cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
if(cookie.getName().equals("user")) {
user = cookie.getValue();
break;
}
}
if(user==null) {
//cookie中没有用户信息
System.out.println("user not login!");
response.getWriter().println("user not login!");
} else {
System.out.println("user="+user);
response.getWriter().println("user:"+user);
}
}
}
Session
Session信息保存在服务器端,保存后会返回一个SessionId给浏览器,这个SessionId会保存在浏览器的Cookie中。(Session默认在服务器端保存半个小时)
例子:
@WebServlet("/session/login")
public class SessionLoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("用户正在请求登录");
HttpSession session = request.getSession();
String sessionId = session.getId();
System.out.println("Login session id = "+sessionId);
session.setAttribute("name", "present");
response.sendRedirect("/request-structural/session/index");
}
}
@WebServlet("/session/index")
public class SessionIndexServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
String sessionId = session.getId(); //同一个页面用同一个 Session 对象
System.out.println("Index session id = "+sessionId);
String name = (String)session.getAttribute("name");
if(name!=null) {
System.out.println("欢迎使用本系统,"+name);
response.getWriter().println("Login sucess!");
System.out.println("登录成功");
}else {
System.out.println("登录失败");
response.getWriter().println("Login Failed!");
}
}
}
Servlet上下文对象 ServletContext
例子:(这里可能会修改的数据使用了 从xml获取 )
有一点一点点的变化:servletContext.getInitParameter(“copyright”);
<context-param>
<param-name>copyright</param-name>
<param-value>@2021 京备案号20409237123</param-value>
</context-param>
<context-param>
<param-name>title</param-name>
<param-value>presentx.top</param-value>
</context-param>
@WebServlet("/servletcontext/init")
public class ServletContexInitServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
response.getWriter().println("init success");
String copyright = servletContext.getInitParameter("copyright");
servletContext.setAttribute("copyright", copyright);
String title = servletContext.getInitParameter("title");
servletContext.setAttribute("title", title);
这样,当copyright或title需要改动的时候只改xml文件就可以了,不用动源代码
}
}
@WebServlet("/servletcontext/default")
public class ServletContextDefaultServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
ServletContext servletContext = request.getServletContext(); //Servlet上下文对象是一个全局对象
//设置属性后可以在任意位置获取
String copyright =(String) servletContext.getAttribute("copyright");
String title = (String) servletContext.getAttribute("title");
response.getWriter().println("<h1>"+title+"</h1>"+copyright);
System.out.println("cout success");
}
}
常用下面这三种对象 设置 Attribute 进行信息的传递。
解决中文乱码问题
response 就设置
response.setContentType("text/html;charset=utf-8");
doPost 的 request 就设置(doGet的request不用管,Tomcat8及以后自动解决)
request.setCharacterEncoding("utf-8");
web.xml 的常用配置
- 设置默认首页(也可以设置二级默认首页)
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
- 设置 404,500等状态码默认页面
<!-- 指定错误页面 error是webapps下的页面-->
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
发布
JSP 九大内置对象
其实就是Servlet里的对象拿到了jsp中,只不过提前起好了变量的名字。