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
posted @ 2020-09-09 03:55  mingmingn  阅读(185)  评论(0)    收藏  举报