前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet进阶开发

Servlet进阶开发

作者头像
Breeze.
发布2022-07-12 15:02:12
3600
发布2022-07-12 15:02:12
举报
文章被收录于专栏:一只无聊的清风

WEB请求与响应解析

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

请求的结构

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

image-20220704135557458
image-20220704135557458

利用请求开发多端应用

代码语言: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响应包含三部分:响应行、响应头、响应体

image-20220704191408592
image-20220704191408592
HTTP常见状态码
image-20220704191629644
image-20220704191629644

ContentType的作用

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

image-20220704193608534
image-20220704193608534

请求转发与响应重定向

多个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>

打包与发布

image-20220706185159926
image-20220706185159926
代码语言: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 文件增加配置

image-20220706190735054
image-20220706190735054

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

image-20220706190851329
image-20220706190851329
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WEB请求与响应解析
    • 请求的结构
      • 利用请求开发多端应用
        • 响应的结构
          • HTTP常见状态码
        • ContentType的作用
          • 请求转发与响应重定向
            • 请求转发
            • 响应重定向
            • 设置请求自定义属性
        • Session与ServletContext原理
          • 浏览器cookie
            • Session 用户会话
              • Session常用方法
                • ServletContext与三大作用域对象
                • Servlet开发应用实践
                  • 解决中文乱码
                    • web.xml配置默认首页与通配符映射
                      • 通配符映射
                    • Servlet启动时加载与错误页面设置
                      • Servlet启动时加载
                      • 错误页面
                  • 打包与发布
                  相关产品与服务
                  数据保险箱
                  数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档