• java web----servlet使用


    1、第一个servlet应用

    导入jar包

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>

    创建一个类

    注意: 创建的包名:不能以java开头, package com.zy.servlet; package  java.com.zy.servlet(会报错的)

    package com.zy.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class ServletDemo extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("<h1>haha</h1>");
        }
    }
    

    补充

    如果重写的是service方法,那么所有的请求都当成get请求来执行下面的代码,如果需要判断get、post方法,通过req.getMethod() 

    public class ServletDemo extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("<h1>hahaha</h1>");
        }
    }

    配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!--配置servlet-->
        <servlet>
        <!--配置servlet类路径,servlet-name任意,servlet-class是一开始创建的servlet类的路径-->
            <servlet-name>ServletDemo</servlet-name>
            <servlet-class>com.zy.servlet.ServletDemo</servlet-class>
        </servlet>
        <!--servlet-name必须和上面的名字一样,url-pattern配置访问的路由 localhost:8080/my-->
        <servlet-mapping>
            <servlet-name>ServletDemo</servlet-name>
            <url-pattern>/my</url-pattern>
        </servlet-mapping>
    </web-app>
    

    在idea配置tomcat,启动,浏览器访问:localhost:8080/my 

    补充

    web3.0可以使用注解的方式替换上面web.xml配置,如下

    @WebServlet("/haha") //注意格式:/url ,url前必须要有"/"
    public class ServletDemo implements Servlet {}   //注意这个Servlet是一个接口,HttpServlet也是继承这个接口的

    tomcat中启动

    在tomcat的webapps目录中创建一个project目录,将下面的文件放进去

                        

    进入tomcat的bin目录,双击startup.bat,浏览器访问 localhost:8080/project/my

    总结

      每一个请求,都需要配置一个servlet,非常麻烦,spring MVC,就是用一个servlet(DispatchServlet),通过这个servlet来讲请求发送给各个handler

    Servlet使用

    仿照HttpServlet写的接口

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ResourceBundle;
     
    public class ServletDemo implements Servlet {
        private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("servlet begin");
        }
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            HttpServletRequest request;
            HttpServletResponse response;
            try {
                request = (HttpServletRequest)req;
                response = (HttpServletResponse)res;
            } catch (ClassCastException var6) {
                throw new ServletException(lStrings.getString("http.non_http"));
            }
            System.out.println(request.getMethod());
            response.getWriter().write(request.getMethod());
        }
        @Override
        public String getServletInfo() {
            return null;
        }
     
        @Override
        public void destroy() {
            System.out.println("servlet end");
        }
    }

    请求转发学习

    注意:无论项目是否有根路径(不是ROOT目录),转发的地址都是"/"

    请求转发学习:
      作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
      使用:
        req.getRequestDispatcher(“要转发的地址").forward(req,resp);地址:相对路径,直接书写servlet的别名即可。
      特点:
        一次请求,浏览器地址栏信息不改变。
      注意:
        请求转发后直接return结束即可。    网址栏上url不变

    请求重定向

    注意:如果项目有根路径(不是ROOT目录),转发的地址都是"/项目更目录/"

    使用:
        resp.sendRedirect("/1ogin/main");
    特点
        两次请求,两个request对象。
        浏览器地址栏信息改变
    时机:
        如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
        如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。

     

    servlet对象

    request对象

    1、获取

    (1)服务器在调用对应的servlet接口,肯定会把request传递进去,我们可以直接获取到

    public class ServletDemo extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("<h1>hahaha</h1>");
        }
    }
    

    (2)通过工具类获取

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

    2、使用

    #获取请求头数据
    #获取请求方式
        String method=req.getMethod();
    #获取请求URL 
        StringBuffer url=req.getRequestURL();
        String uri=req.getRequestURI();
    #获取协议
        String h=req.getscheme();
    #获取请求行数据
        //获取指定的请求行信息
        String value=req.getHeader("User-Agent");
    #获取所有的请求行的键的枚举
        Enumeration e=req.getHeaderNames();
        while(e. hasMoreElements()){
        string name=(String)e. nextElement());
    #获取参数
        String name=req.getParameter("uname),  #注意getparameter不能获取同键不同值的多个数据(像复选框之类的);
        String[] likes=req.getParameterValues("like"); #可以获取多个值了

    Response对象

    //设置响应头
        resp.setHeader(String name,String value);//在响应头中添加多个响应信息,但是同键会覆盖
        resp.addHeader(String name,String value);//在响应头中添加多个响应信息,但是不会覆盖。
    //设置响应状态码
        resp. sendError(405,"this Method is not supported");
    //设置响应实体(在页面上展示的)
        resp.getWriter().write("this is resp study");
    //设置响应编码格式,解决乱码
        resp.setHeader("content-type","text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");//简写,text/html,会将<b></b>等html标签解析
        resp.setContentType("text/plain;charset=utf-8"); //会把<b></b>等标签当做普通的文本显示在浏览器上
        resp.setContentType("text/xml;charset=utf-8"); //会把响应的数据以xml的格式显示在浏览器上

    ServletContext对象

    • 需求:不同的用户需要使用同一个对象
    • 特点:服务器创建,用户共享
    • 生命周期:服务器启动到服务器关闭
    • 作用域:整个项目内
    getParameter()是获取POST/GET传递的参数值;
    getInitParameter获取Tomcat的server.xml中设置Context的初始化参数
    getAttribute()是获取对象容器中的数据值;
    getRequestDispatcher是请求转发。

    1、介绍

    获取方式:
    //第一种方式(常用)
        ServletContext sc=this.getservletContext();
    //第二种方式
        ServletContext sc2=this.getServletConfig().getServletContext();
    //第三种方式(常用)
        ServletContext sc3=req.getSession().getServletContext();
    数据存储
        sc.setAttribute(String name,Object value);
    数据获取
        sc.getAttribute("str")返回的是0bject类型

    2、使用

    获取项目中web.xml文件中的全局配置数据

    作用:使静态数据和代码进行解耦

    (1)在web.xml 配置全局数据

    <!--配置全局数据-->
    <context-param>  #注意一个context-param只能配置一个键值对
            <param-name>name</param-name>
            <param-value>zhangsan</param-value>
    </context-param>
    

    (2)获取

    #获取项目中web.xm1文件中的全局配置数据
    sc.getInitParameter(String name);根据键的名字返回web.xml中配置的全局数据的值,返回String类型。如果数据不存在返回nul1。
    sc.getInitParameterNames();返回键名的枚举

    (3)获取资源的绝对路径和资源的流对象

    #获取项目webroot下的资源的绝对路径。
    String path=sc.getRealPath(String path);获取的路径为项目根目录,path参数为项目根目录中的路径
    #获取webroot下的资源的流对象
    InputStream is=sc.getResourceAsStream(String path);
    注意:
      此种方式只能获取项目根目录下的资源流对象,c1ass文件的流对象需要使用类加载器获取。
      path参数为项目根目录中的路径
    webroot:在tomcat服务器上,就相当于webapps的绝对路径

    ServletConfig对象

    • 作用:专门给servlet自己做配置的对象,别的servlet获取不到该数据。
    • 操作:在web.xml配置

    1、配置

    <servlet>
            <servlet-name>ServletDemo</servlet-name>
            <servlet-class>com.zy.servlet.ServletDemo</servlet-class>
            <init-param>  //注意只能在自己的servlet中配置数据
                <param-name>name</param-name>
                <param-value>zhangsan</param-value>
            </init-param>
    </servlet>
    

    2、获取

    //获取ServletConfig对象
        ServletConfig sc=this.getServletConfig();
    //获取web.xm1中的配置数据
        String name=sc.getInitParameter("name");    
        System.out.print1n(name);
    

      

    web.xml解析

    区别:
        Web项目下的web.xml文件为局部配置,针对本项目的位置。
        Tomcat下的web.xml文件为全局配置,配置公共信息。

    内容(核心组件):
        全局上下文配置(全局配置参数)
        Servlet配置  
        过滤器配置
        监听器配置

            加载顺序:        

             Web容器会按ServletContext->context-param->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。

          加载时机:
            服务器启动时。

    server.xml解析

    核心组件

    <Server>
        <Service> //一个server下可以配置多个service,可以在配置端口,就可以通过不同的端口访问
            <Connector/>   //配置端口,可以配置多个
            <Connector/>
            <Engine>       //引擎,只能配置一个
                <Host>         //配置项目的存放位置的根目录
                  <Context/>
                </Host>
            </Engine>
        </Service>
    </Server>    
    

    热部署

    在Host中配置,如果将项目删除了,记得tomcat的server.xml要将这段代码删除掉,否则会报错,但是tomcat其他的项目还是正常的启动。

    <Context path ="/Pet" reloadable ="true" docBase="F:/PetWeb"/>
    

      解释:/Pet  :虚拟路径,请求的时候需要带上

           /F:/PetWeb :热部署的项目;

    servlet过滤器

    <filter>
      <filter-name>LogFilter</filter-name>
      <filter-class>com.runoob.test.LogFilter</filter-class>
      <init-param>
        <param-name>Site</param-name>
        <param-value>菜鸟教程</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>LogFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

      补充:Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。

    注意doFilter既可以拦截请求,可以拦截响应(是典型的责任链模式)

    chain.doFilter(request,response);
    Systen.out.println("--MyFilter过滤器执行之后");

    参考:https://www.runoob.com/jsp/jsp-writing-filters.html

               https://my.oschina.net/u/1171518/blog/265467

    Servlet监听器

    监听器Listener就是在application,session,request三个对象创建,销毁,或者往其中添加修改删除属性时自动执行代码的功能组件。Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

    创建几个java类实现监听接口

    package com.zy.listener;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener , HttpSessionListener , HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{
        //对request对象
        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            //如果某些数据有用,在销毁的前,将他存放到ServletContext中
            Object xx = sre.getServletRequest().getAttribute("xx");
            sre.getServletContext().setAttribute("xx",xx);
            System.out.println("request对象被销毁");
        }
        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            System.out.println("request对象初始化");
        }
        //对request属性监听
        @Override
        public void attributeAdded(ServletRequestAttributeEvent srae) {
            String name = srae.getName();
            Object value = srae.getValue();
        }
        @Override
        public void attributeRemoved(ServletRequestAttributeEvent srae) {
    
        }
    
        @Override
        public void attributeReplaced(ServletRequestAttributeEvent srae) {
    
        }
    
        //对session对象监听
        @Override
        public void sessionCreated(HttpSessionEvent se) {
    
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
    
        }
        //对session属性的监听
        @Override
        public void attributeAdded(HttpSessionBindingEvent se) {
    
        }
    
        @Override
        public void attributeRemoved(HttpSessionBindingEvent se) {
    
        }
    
        @Override
        public void attributeReplaced(HttpSessionBindingEvent se) {
    
        }
        //对servletcontext对象监听
        @Override
        public void contextInitialized(ServletContextEvent sce) {
    
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
    
        }
        //对servletcontext属性的监听
        @Override
        public void attributeAdded(ServletContextAttributeEvent scae) {
    
        }
    
        @Override
        public void attributeRemoved(ServletContextAttributeEvent scae) {
    
        }
    
        @Override
        public void attributeReplaced(ServletContextAttributeEvent scae) {
    
        }
    }

    web.xml配置

    Listener的配置信息必须在Filter和Servlet的配置之前,Listener的初始化(ServletContextListener初始化)比Servlet和Filetr都优先,而销毁比Servlet和Filter都慢。

    <listener>
            <listener-class>com.zy.listener.RequestListener</listener-class>
    </listener>
    

    需求,Tomcat启动的时候,加载配置文件

    1、方式1:使用servlet--->init方法---><load-on-startup>

    2、方式2:使用filter--->init方法--->web.xml注册过滤器之后自动调用初始化

    3、方式3:使用监听器,ContextLoaderLister(spring推荐使用)

    使用方式3:

    需要额外导入jar包,spring-web

    参考我的另一篇博客:https://i.cnblogs.com/EditPosts.aspx?postid=10827203&update=1

  • 相关阅读:
    疯狂Java学习笔记(008)
    CSS-链接
    css学习:css样式的引入
    两个文本根据索引key关联合并,将无关联信息单独输出
    三 数据挖掘算法
    二、数据挖掘
    vsftp虚拟账户设置
    python3在linux下的编码错误
    python 一个根据正则判断输入的函数
    python excel读写与dict转换
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/13803200.html
Copyright © 2020-2023  润新知