关于Servlet以及过滤器Filter要点

Servlet :Java Servlet的简称,用Java编写的服务端程序,具有独立于平台和协议的特征,主要功能在于交互式浏览和生成数据,生成动态的web内容。

Servlet为一个接口,直接实现类为 GenericServlet(抽象类)  ,Httpservlet继承此类,一般我们会继承HttpServlet重写其doPost()以及doGet()方法,重点关注HttpServlet中的Service()方法。

可通过父类中的getServletContext()方法获取到ServletContext对象,此对象为web容器中的全局对象,多个Servlet可共享此对象。因此可以使用setAttribute(p1,p2)进行不同Servlet间的数据传递。

要区别“重定向”跟“请求转发”的区别:

  1. 重定向是两次请求,转发是一次请求,因此转发的速度会快于重定向。
  2. 重定向之后地址栏的地址会发生改变,变成第二次请求的地址,而转发地址不会改变,还是第一次请求的地址。
  3. 转发是服务器行为,重定向是客户端行为。
  4. 重定向时的网址可以是任何的网址,转发的网址必须是本站点的网址

    请求转发可通过两种方式实现:
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            servletContext.getRequestDispatcher("/xxxx转发的路径").forward(req,resp);
        }
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getRequestDispatcher("xxx路径").forward(req,resp);
        }

     

    重定向由Httpservlet对象实现:

    

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("xxxx地址");
    }

 

Servlet还需要配置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_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>hello</servlet-name>
<!--    需要映射的对应servlet类-->
    <servlet-class>com.david.Test2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
<!--指定访问的路径-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>
复制代码

 

jsp本质也是一个servlet,只是它会将页面中的html标签全部使用out.write("xxx")输出到页面上,非html标签(即Java代码)原封不动的保存,会在tomacat的work目录下生成一个对应的class类文件,里面就是

经过处理后的Java代码,本质就是一个servlet。

重点关注jsp中的九大内置对象:

1.HttpServletRequet类的Request对象:代表请求对象,主要用于接受客户端通过HTTP协议连接传输服务器端的数据。

2.HttpSevletResponse类的Response对象:代表响应对象,主要用于向客户端发送数据。

3.JspWriter类的out对象:主要用于向客户端输出数据,out的基类是jspWriter

4.HttpSession类的session对象:主要用来分别保存每个月的信息与请求关联的会话;会话状态的维持是web应用开发者必须面对的问题。

5.ServletContext类的application对象:主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器中的多个用户共享一个application,故其保存的信息被所有用户所共享。

6.PageContext类的PageContext对象:管理网页属性,为jsp页面包装页面的上下文,管理对属于jsp的特殊可见部分中已经命名对象的访问,它的创建和初始化都是由容器来完成的。

7.ServletConfig类的Config对象:代码片段配置对象,标识Servlet的配置。

8.Object类的Page对象,处理jsp页面,是object类的一个实例,指的是jsp实现类的实例

9.Exception对象:处理jsp文件执行时发生的错误和异常,只有在错误页面里才使用,前提是在页面指令里要有isErrorPage=true。

 

servlet中的过滤器Filter(重点):

实现Filter接口:

复制代码
public class Test1 implements Filter  {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }

    @Override
    public void destroy() {
    }
}
复制代码

重点使用方法为doFilter(),在请求到达指定servlet之前会走此方法,进行一些编码转换之类的处理,处理完成之后,一定要使用  filterChain.doFilter(servletRequest,servletResponse)方法将此方法丢到下一个

过滤器,如果不适用此方法,程序会一直停在此处。

过滤器也需要配置,在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_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>hello</servlet-name>
<!--    需要映射的对应servlet类-->
    <servlet-class>com.david.Test2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
<!--指定访问的路径-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  <filter>
    <filter-name>filterTest</filter-name>
    <filter-class>com.david.Test1</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filterTest</filter-name>
<!-- 表示所有/hello/* 请求都会走这个过滤器-->
    <url-pattern>/helle/*</url-pattern>
  </filter-mapping>
</web-app>
复制代码

 

 

 

 

 

 

 

 

 

 

  

 

posted @   码农小白David  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示