2-2-3 Java Web基础-Servlet与JSP
HTTP请求结构
包含三部分:请求行,请求头,请求体

使用userAgent开发多端应用
userAgent请求头可以获取操作环境,可以做多端开发
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 8 /** 9 * @description: 利用请求头开发多端应用 10 */ 11 @WebServlet("/ua") 12 public class UserAgentServlet extends HttpServlet { 13 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 15 } 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 String userAgent = request.getHeader("User-Agent"); 19 response.setContentType("text/html;charset=utf-8"); 20 String output = ""; 21 response.getWriter().println(userAgent); 22 if (userAgent.indexOf("Windows NT") != -1) { 23 output = "<h1>这是PC端首页</h1>"; 24 } else if(userAgent.indexOf("iPhone") != -1 || userAgent.indexOf("Android") != -1) { 25 output= "<h1>这是移动端首页</h1>"; 26 } 27 response.getWriter().println(output); 28 } 29 }
HTTP响应结构
包含三部分:响应行,响应头,响应头

HTTP常见状态码
| 状态码 | 描述 |
| 200 | 服务器处理成功 |
| 404 | 无法找到文件 |
| 500 | 内部服务器错误 |
| 403 | 服务器拒绝访问 |
| 301,302 | 请求重定向 |
| 400 | 无效的请求 |
| 401 | 未经过授权 |
| 503 | 服务器超负载或正停机维护,无法处理请求 |
ContentType的作用
ContType决定浏览器采用何种方式对响应体进行处理
| MINE类型 | 描述 |
| text/plain | 纯文本 |
| text/html | HTML文档 |
| text/xml | XML文档 |
| application/x-msdownload | 需要下载的资源 |
|
image/jpeg image/gif image/... |
图片资源 |
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 8 @WebServlet("/ct") 9 public class ContentTypeServlet extends HttpServlet { 10 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 11 12 } 13 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 String output = "<h1><a href='http://www.baidu.com'><span>百度</span></a></h1>"; 16 response.setContentType("text/html;charset=utf-8"); 17 response.getWriter().println(output); 18 } 19 }
请求转发与响应重定向
多个servlet(jsp)之间跳转有两种方式
request.getRequestDispatcher().forward()-请求转发
请求转发是服务器跳转,只会产生一次请求,且浏览器网页地址不会发生改变
response.sendRedirect()-响应重定向
响应重定向是浏览器跳转,会产生两次请求,浏览器网页地址会发生改变
设置请求自定义属性
设置请求属性:request.setAttribute(属性名,属性值)
获取请求属性:request.getAttribute(属性名)
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 8 9 @WebServlet("/direct/checkLogin") 10 public class CheckLoginServlet extends HttpServlet { 11 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 13 } 14 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 16 System.out.println("用户登录成功"); 17 request.setAttribute("username","admin"); 18 //请求转发 19 //request.getRequestDispatcher("/direct/index").forward(request,response); 20 //响应重定向需要增加contextPath 21 response.sendRedirect("/servletAndJsp/direct/index"); 22 } 23 }
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 8 9 @WebServlet("/direct/index") 10 public class IndexServlet extends HttpServlet { 11 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 13 } 14 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 16 String username = (String)request.getAttribute("username"); 17 response.getWriter().println("This is index page!current username is " + username); 18 } 19 }
注意使用响应重定向不会获取到跳转的请求属性,因为响应重定向会产生两次请求,第二次请求获取不到第一请求的属性.
浏览器Cookie
Cookie是浏览器保存在本地的文本内容
Cookie常用于保存登录状态,用户资料等小文本
Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat
Cookie使用方法
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/cookie/login") public class CookieLoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("用户登录成功"); Cookie cookie = new Cookie("user", "admin"); cookie.setMaxAge(60 * 60 * 24 *7); response.addCookie(cookie); response.getWriter().println("login success"); } }
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.Cookie; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 9 10 @WebServlet("/cookie/index") 11 public class CookieIndexServlet extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 //request.getCookies()用户获取所有的Cookie 15 Cookie[] cs = request.getCookies(); 16 if(cs == null) { 17 response.getWriter().println("user not login"); 18 return; 19 } 20 String user = null; 21 for(Cookie c : cs) { 22 System.out.println(c.getName() + ":" + c.getValue()); 23 if(c.getName().equals("user")) { 24 user = c.getValue(); 25 break; 26 } 27 } 28 29 if(user == null) { 30 response.getWriter().println("user not login"); 31 }else { 32 response.getWriter().println("user:" + user); 33 } 34 35 } 36 }
Session-用户会话
Session(用户会话)用于保存于"浏览器窗口"对应的数据
Session的数据存储在Tomcat服务器内存中,具有时效性
Session通过浏览器Cookie的SessionId值提取用户数据
Session常用方法
request.getSession() - 获取Session对象
get|set|removeAttribute() -获取|设置|删除Session对象
setMaxInactiveInterval - 设置Session超时时间
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpSession; 7 import java.io.IOException; 8 9 10 @WebServlet("/session/login") 11 public class SessionLoginServlet extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 System.out.println("用户登录成功"); 15 HttpSession session = request.getSession(); 16 String sessionId = session.getId(); 17 System.out.println(sessionId); 18 session.setAttribute("name", "张三"); 19 request.getRequestDispatcher("/session/index").forward(request, response); 20 21 } 22 }
1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpSession; 7 import java.io.IOException; 8 9 10 @WebServlet("/session/index") 11 public class SessionIndexServlet extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 HttpSession session = request.getSession(); 15 String sessionId = session.getId(); 16 System.out.println(sessionId); 17 String name = (String)session.getAttribute("name"); 18 response.setContentType("text/html;charset=utf-8"); 19 response.getWriter().println("这是首页,当前用户为:" + name); 20 } 21 }
ServletContext
ServletContext(Servlet上下文对象),是web应用全局对象
一个Web应用只会创建一个ServletContext对象
ServletContext随着Web应用启动而自动创建.
在web.xml文件中添加
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 7 <context-param> 8 <param-name>copyright</param-name> 9 <param-value>© 2018 mingm.com</param-value> 10 </context-param> 11 <context-param> 12 <param-name>title</param-name> 13 <param-value>初始化数据</param-value> 14 </context-param> 15 </web-app>
1 import javax.servlet.ServletContext; 2 import javax.servlet.ServletException; 3 import javax.servlet.annotation.WebServlet; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 9 @WebServlet("/servletcontext/init") 10 public class ServletContextInitServlet extends HttpServlet { 11 12 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 ServletContext context = request.getServletContext(); 14 String copyright = context.getInitParameter("copyright"); 15 context.setAttribute("copyright", copyright); 16 String title = context.getInitParameter("title"); 17 context.setAttribute("title", title); 18 response.getWriter().println("init success"); 19 } 20 }
1 import javax.servlet.ServletContext; 2 import javax.servlet.ServletException; 3 import javax.servlet.annotation.WebServlet; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 9 @WebServlet("/servletcontext/default") 10 public class ServletContextDefaultServlet extends HttpServlet { 11 12 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 ServletContext context = (ServletContext)request.getServletContext(); 14 String copyright = (String)context.getAttribute("copyright"); 15 String title = (String)context.getAttribute("title"); 16 response.setContentType("text/html;charset=utf-8"); 17 response.getWriter().println("<h1>" + title + "</h1>" + copyright); 18 } 19 }
Java Web三大作用域对象
HttpServletRequest - 请求对象
HttpSession - 用户会话对象
ServletContext-web应用全局对象
作用范围依次扩大
Web应用的中文乱码
原因
Tomcat默认使用字符集ISO-8859-1,属于西欧字符集
解决乱码的核心思路是将ISO-8859-1转化为UTF-8
Servlet中请求与响应都需要设置UTF-8字符集
解决方法
请求乱码解决
方法一:
1 String ename = request.getParameter("ename"); 2 String address = request.getParameter("address"); 3 System.out.println(ename + ":" + address); 4 String utf8Ename = new String(ename.getBytes("iso-8859-1") , "utf-8"); 5 String utf8Address = new String(address.getBytes("iso-8859-1") , "utf-8");
方法二:在doPost方法中使用
1 //request.setCharacterEncoding方法用于将请求体中的字符集转换为UTF-8 2 request.setCharacterEncoding("UTF-8");
方法三:修改Tomcat配置
进入/apache-tomcat-8.5.51/conf/server.xml文件
找到
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
添加URIEncoding="UTF-8"
1 <Connector port="8080" protocol="HTTP/1.1" 2 connectionTimeout="20000" 3 redirectPort="8443" URIEncoding="UTF-8" />
注意:对于Tomcat8.x的版本,默认get请求发送中文就是UTF-8的格式,因此无需转换
响应乱码解决
1 response.setContentType("text/html;charset=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>
利用url传参
1 <servlet> 2 <servlet-name>patternServlet</servlet-name> 3 <servlet-class>com.imooc.servlet.pattern.PatternServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>patternServlet</servlet-name> 7 <url-pattern>/pattern/*</url-pattern> 8 </servlet-mapping>
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class PatternServlet extends HttpServlet{ 10 11 @Override 12 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 //查询员工的基本信息 14 //获取当前访问的URL 15 String url = request.getRequestURL().toString(); 16 System.out.println(url); 17 String id = url.substring(url.lastIndexOf("/") + 1); 18 int eid = Integer.parseInt(id); 19 response.setContentType("text/html;charset=utf-8"); 20 PrintWriter out = response.getWriter(); 21 out.println(id); 22 if(eid == 1) { 23 out.println("张三"); 24 }else if(eid == 2) { 25 out.println("李四"); 26 }else { 27 out.println("其他员工"); 28 } 29 30 } 31 32 }
访问路径为:localhost:8080/context_path/pattern/1
设置404,500等状态码默认页面
1 <!-- 指定错误页面 --> 2 <error-page> 3 <error-code>404</error-code> 4 <location>/error/404.html</location> 5 </error-page> 6 <error-page> 7 <error-code>500</error-code> 8 <location>/error/500.jsp</location> 9 </error-page>
JSP九大内置对象
| 内置对象 | 描述 |
| request | 请求对象 - HttpServletRequest |
| response | 响应对象 - HttpServletResponse |
| session | 用户会话 -HttpSession |
| application | 应用全局对象 - ServletContext |
| out | 输出对象 - PrintWriter |
| page | 当前页面对象 - this |
| pageContext | 页面上下文对象 - PageContext |
| config | 应用配置对象 - ServletConfig |
| exception | 应用异常对象 - Throwable |

浙公网安备 33010602011771号