Servlet进阶开发

2022-07-12 15:02:12 浏览数 (1)

WEB请求与响应解析

  • URL统一资源定位符,表示Web应用对外暴露的访问地址
    • 示例:http://www.imooc.com/index.html
  • URI统一资源标识符,表示Web应用资源的访问路径
    • 示例:/index.html

请求的结构

HTTP请求包含三部分:请求行、请求头、请求体

利用请求开发多端应用

代码语言:javascript复制
@WebServlet("/ua")
public class UesrAgentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 得到请求结构 User-Agent中的属性
        String ua = request.getHeader("User-Agent");
        String output = "";
        // 判断获取的参数
        if (ua.toLowerCase().indexOf("iphone") != -1 || ua.toLowerCase().indexOf("android") != -1) {
            output = "<h1>这是移动端页面</h1>";
        } else if (ua.toLowerCase().indexOf("windows nt") != -1) {
            output = "<h1>这是PC端页面";
        }
        // 设置为UTF-8字符集
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(output);
    }
}

响应的结构

HTTP响应包含三部分:响应行、响应头、响应体

HTTP常见状态码

ContentType的作用

ContentType 决定浏览器采用何种方式对响应体进行处理

请求转发与响应重定向

多个Servlet之间跳转有两种方式:

  1. request.getRequestDispatchar().forward():请求转发
  2. response.sendRedirect():响应重定向
请求转发

请求转发是服务器跳转,只会产生一次请求

响应重定向

重定向则是浏览器端跳转,会产生两次请求

设置请求自定义属性

请求允许创建自定义属性

设置请求:request.setAttribute(属性名,属性值)

获取请求属性: Object attr = request.getAttribute(属性名)

Session与ServletContext原理

浏览器cookie

Cookie 是浏览器保存在本地的文本内容。Cookie默认域名绑定,只有当前域名下的程序才能读取数据。Cookie具有时效性,Cookie会伴随请求头发送给服务器。

Cookie的时效性有两种情况:

  1. 默认Cookie有效期与当前浏览器进程绑定
  2. 设置过期时间后,Cookie过期后才会时效
代码语言:javascript复制
/**
 * 用于生成随机数的Cookie
 */
@WebServlet("/cookie/random")
public class RandomServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取随机整数
        Integer random = new Random().nextInt(10000);
        Cookie cookie = new Cookie("random", String.valueOf(random));
        // 设置Cookie时效
        cookie.setMaxAge(60*60*24);
        // 将cookie添加到响应中
        response.addCookie(cookie);
        // 设置内容类型
        response.setContentType("text/htmll;charset=utf-8");
        response.getWriter().write("<h2>Random:"   random   "已生成</h2>");
    }
}
代码语言:javascript复制
/**
 * 读取Cookie
 */
@WebServlet("/cookie/show")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取Cookie
        Cookie[] cookies = request.getCookies();
        response.setContentType("text/html;charset=utf-8");
        if (cookies == null) {
            response.getWriter().println("未生成Cookie");
        }
        Integer random = -1;
        for (Cookie c : cookies) {
            if (c.getName().equals("random")) {
                random = Integer.parseInt(c.getValue());
            }
        }
        response.getWriter().write("<h3>Random:"   random   "</h3>");
    }
}

Session 用户会话

Session(用户会话)用于保存与“浏览器窗口”对应的数据 Session的数据存储在Tomcat服务器的内存中,具有时效性 Session通过浏览器Cookie的Sessionld值提取用户数据

Session常用方法

request.getSession()-获取Session对象

get|set|removeAttribute()-获取|设置|删除Session属性

setMaxlnactivelnterval()-设置Session超时时间

代码语言:javascript复制
@WebServlet("/session/random")
public class RandomServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Integer random = new Random().nextInt(100000);
        // 获取当前请求绑定的Session对象
        HttpSession session = request.getSession();
        session.setAttribute("random", random);
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("<h2>随机数:"   random   "已生成</h2>");
    }
}
代码语言:javascript复制
@WebServlet("/session/show")
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        // 获取Session属性
        int random = (Integer) session.getAttribute("random");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println("随机数:"   random);
    }
}

ServletContext与三大作用域对象

ServletContext(Servlet上下文对象),是Web应用全局对象 一个Web应用只会创建一个ServletContext对象 ServletContext随着Web应用启动而自动创建

Java Web三大作用域

从小到大(降序排序)

HttpServletRequest

请求对象

HttpSession

用户会话对象

ServletContext

Web应用全局对象

Servlet开发应用实践

解决中文乱码

发送方与接收方对数据使用不同的字符集解析就会产生乱码,解决乱码的思路是保证浏览器与服务器统一为UTF-8编码即可

Toncat 8以后的版本字符集默认为UTF-8

Tomcat 8以前的版本默认字符集为ISO-8859-1,需要在server.xml配置字符集:URIEncoding=“UTF-8”

代码语言:javascript复制
@WebServlet("/encoding/search")
public class ServletSearch extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Toncat 8以后的版本字符集默认为UTF-8
        // Tomcat 8以前的版本默认字符集为ISO-8859-1,需要在server.xml配置字符集:URIEncoding=“UTF-8”
        String keywork = request.getParameter("keywork");
        System.out.println(keywork);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 利用UTF-8编码解析请求体中的请求参数
        request.setCharacterEncoding("UTF-8");
        String keywork = request.getParameter("keywork");
        System.out.println(keywork);
    }
}

web.xml配置默认首页与通配符映射

代码语言:javascript复制
<!--默认首页设置-->
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>default.html</welcome-file>
</welcome-file-list>
通配符映射
代码语言:javascript复制
<servlet>
    <servlet-name>pattern</servlet-name>
    <servlet-class>hua.pers.servlet.PatternServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>pattern</servlet-name>
    <!--http://www.imooc.com/class/786 -->
    <url-pattern>/class/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>pattern</servlet-name>
    <!-- http://www.imooc.com/786.class -->
    <url-pattern>/*.class</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>pattern</servlet-name>
    <!--对所有请求进行映射,Spring MVC框架中会使用到这个特性-->
    <url-pattern>/</url-pattern>
</servlet-mapping>
代码语言:javascript复制
public class PatternServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //url:/class/786
        String uri = request.getRequestURI();
        String id = uri.substring(uri.lastIndexOf("/")   1);
}

Servlet启动时加载与错误页面设置

Servlet启动时加载

web.xml使用设置启动加载 0~9999 启动时加载在工作中常用与系统的预处理

代码语言:javascript复制
<servlet>
    <servlet-name>inittable</servlet-name>
    <servlet-class>hua.pers.servlet.startup.InitTableServlet</servlet-class>
    <init-param>
        <param-name>database</param-name>
        <param-value>db01</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet>
    <servlet-name>import</servlet-name>
    <servlet-class>hua.pers.servlet.startup.ImportServlet</servlet-class>
    <init-param>
        <param-name>file</param-name>
        <param-value>c:/tmp.txt</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
代码语言:javascript复制
public class InitTableServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        String database = config.getInitParameter("database");
        System.out.println("正在向"   database   "创建数据表...");
    }
}
代码语言:javascript复制
public class ImportServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        String file = config.getInitParameter("file");
        System.out.println("正在导入"   file   "数据...");
    }
}
错误页面
代码语言:javascript复制
<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>

打包与发布

代码语言:javascript复制
<!--决定压缩式的jar包还是war包-->
<packaging>war</packaging>
<!--依赖jar-->
<dependencies>
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>xxx</artifactId>
        <version>x.x.x</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<!-- 设置包名 -->
<build>
    <finalName>名字</finalName>
</build>
<b

在server.xml 文件增加配置

不然会以默认的文件夹名web-servlet访问

0 人点赞