JavaWeb之Tomcat

Tomcat

安装

  • tomcat8.5地址 下载压缩包解压即可
  • 安装时需要注意:tomcat版本与java版本要相对应
  • JAVA_HOME 等路径要配置正确

tomcat目录结构

  • bin 启动目录
  • conf 配置目录
  • webapps 工程目录

部署工程

  • 直接放webapps,通过ip:端口/目录/文件 的形式访问(简化部署 打包war格式压缩包)
  • conf/Catalina/项目.xml (这种方式是热加载,可以在不关闭Tomcat的情况下生效)
<Context docBase="项目路径" path="/虚拟目录"/>
  • Root工程
 默认访问Root文件夹下的项目;加载顺序为 index.html index.jsp

IDEA 与Servlet

  • idea 需要在项目中 【Add Frameworks Support】选中【Web Application】,但是新版本是没有的,
    因此需要
CTRL+alt+shift+/,选择registry,找到javaee.legacy.project.wizard**,勾选

退出后再【Add Frameworks Support】即可,IDEA会自动添加 WEB目录

Servlet

截屏2023-02-05 20.17.02.png
  • Servlet 生命周期
    • 首次访问时,构造函数
    • init()
    • service()
    • 断开链接时,destroy()
  • server applet 运行在服务器端的小程序, 位于 javax.servlet.*
  • 单例, 多个用户同时访问, 会产生线程安全问题, 所以避免创建成员变量
  • 简单的Servlet步骤
// 1. 创建项目
// 2. 定义类,实现javax.servlate.Servlet接口, 例如: Servlet
// 3. 配置web.xml
package com.it.web.servlet;
import javax.servlate.*;
// 有多个接口方法,这里只写一个
public class ServletDemo implements Servlet {
      @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("hello Servlet");
        }
}
// 文件web.xml web-app中添加
<!-- 配置Servlet -->
    <servlet>
        <servlet-name>服务名</servlet-name>
        <servlet-class>com.it.web.servlet.ServletDemo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>服务名</servlet-name>
        <url-pattern>访问url</url-pattern>
    </servlet-mapping>
  • 使用注解 代替简单的web.xml
@WebServlet(
        urlPatterns = {"/request", "/servletContext"},
        initParams = {
                @WebInitParam(name = "key", value = "value"),
                @WebInitParam(name = "testName", value = "testValue"),
        }
)
public class ServletDemo implements Servlet {
      @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("demo2");
        }
}
  • urlPattern 路径设置

    • "/xxx"
    • @WebServlet({"/demo3", "/demo4"})
    • "/xx/*" 正则匹配 优先级最低
  • GenericServlet 将Servlet接口中的方法做了空实现,只抽象了 service() 方法

  • HttpServlet 实现了web访问各种形式,Get\Post\Update\Delete\Option\Put等

  • 转发路由

servletRequest.getRequestDispatcher("/demo3").forward(servletRequest, servletResponse);

ServletConfig

  • 获取 ServletContext
  • 每个Servlet不同的配置参数
  • getServletName()

ServletContext

  • 获取MINI类型: 文件数据类型, 格式 大类型/小类型 ,例如: text/html, bz/application/x-bzip
  • 域对象 共享数据; 共享所有数据, 服务打开就会创建, 服务关闭才会销毁
  • 获取文件的真实(服务器)路径
    ServletContext servletContext = getServletContext();
    servletContext.getRealPath("/WEB-INF/web.xml");

HttpServletRequest

获取请求头、请求体数据

StringBuilder result = new StringBuilder();
        // 1. 获取所有参数
        String contentType = req.getHeader("Content-Type");

        result.append("ContentType = ").append(contentType).append("\n<br />");

        if (Objects.nonNull(contentType) && (contentType.startsWith("multipart/form-data") || contentType.startsWith("application/json"))) {
            result.append("contentType START").append("\n<br />");
            // 通过 流 获取数据
            BufferedReader reader = req.getReader();
            String line = null;
            while ((line = reader.readLine()) != null) {
                result.append(line).append("\n<br />");
            }

            result.append("contentType END").append("\n<br />");
        }

        Map<String, String[]> parameterMap = req.getParameterMap();

        parameterMap.forEach((k, v) -> {
            result.append("key => ").append(k).append(", value => ");
            for (String s : v) {
                result.append(s).append(", ");
            }
            result.append("\n").append("<br>");
        });

        result.append("获取请求URL").append(req.getRequestURI()).append("\n<br />");
        result.append("获取虚拟目录").append(req.getContextPath()).append("\n<br />");
        result.append("获取get方式请求参数").append(req.getQueryString()).append("\n<br />");
        result.append("获取客户机的IP地址").append(req.getRemoteAddr()).append("\n<br />");
        ServletConfig servletConfig = getServletConfig();
        result.append("初始化参数-key: ").append(servletConfig.getInitParameter("key")).append("\n<br />");
        result.append("初始化参数-testName: ").append(servletConfig.getInitParameter("testName")).append("\n<br />");
        resp.getWriter().write(result.toString());

请求转发

 req.getRequestDispatcher("/dispatcher").forward(req, resp);

共享数据

// 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
 1. void setAttribute(String name,Object obj):存储数据
 2. Object getAttitude(String name):通过键获取值
 3. void removeAttribute(String name):通过键移除键值对

获取cookie

   Cookie[] cookies = request.getCookies();
        response.setContentType("text/html;charset=UTF-8");
        StringBuilder stringBuilder = new StringBuilder();
        if (Objects.nonNull(cookies)) {
            for (Cookie cookie : cookies) {
                stringBuilder.append("<h3>").append("name:").append(cookie.getName()).append(", ").append("value:").append(cookie.getValue()).append(
                        "<h3/>");
            }
        }

        response.getWriter().write(stringBuilder.toString());

获取Session

request.getSession();

HttpServletResponse

重定向

  • 转发重定向时,不共享请求参数

规定响应内容

  response.setStatus(302);
  response.setContentType("text/html;charset=UTF-8");
  response.getOutputStream().write(("ResponseServlet GET方法" + request.getParameter("name")).getBytes(StandardCharsets.UTF_8));

字符输出

输出文件流


发送cookie

    Cookie cookie = new Cookie("name",  "你好");
    Cookie cookie2 = new Cookie("age", (count++) + "");
    // 存活时间
     // cookie 默认只能在当前工程下访问, 使用 / 则整个tomcat下使用
      cookie2.setPath("/");
      response.addCookie(cookie);
      response.addCookie(cookie2);

Filter

实现接口Filter

@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
            public class FilterDemo1 implements Filter {
                @Override
                public void init(FilterConfig filterConfig) throws ServletException {
            
                }
            
                @Override
                public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                    System.out.println("filterDemo1被执行了....");
            
            
                    //放行
                    filterChain.doFilter(servletRequest,servletResponse);
            
                }
            
                @Override
                public void destroy() {
            
                }
            }

过滤器生命周期方法

  • init() 只会执行一次
  • doFilter() 每一次请求被拦截资源时,会执行。执行多次
  • destroy() 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

Listener

  • 事件监听机制

ServletContextListener

  • void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
  • void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
  • 主要作用:初始化对象、初始化数据(如:加载驱动、创建数据库连接、连接池的初始化等)

spring mvc

xml解析
json解析
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容