关于Servlet以及过滤器Filter要点
Servlet :Java Servlet的简称,用Java编写的服务端程序,具有独立于平台和协议的特征,主要功能在于交互式浏览和生成数据,生成动态的web内容。
Servlet为一个接口,直接实现类为 GenericServlet(抽象类) ,Httpservlet继承此类,一般我们会继承HttpServlet重写其doPost()以及doGet()方法,重点关注HttpServlet中的Service()方法。
可通过父类中的getServletContext()方法获取到ServletContext对象,此对象为web容器中的全局对象,多个Servlet可共享此对象。因此可以使用setAttribute(p1,p2)进行不同Servlet间的数据传递。
要区别“重定向”跟“请求转发”的区别:
- 重定向是两次请求,转发是一次请求,因此转发的速度会快于重定向。
- 重定向之后地址栏的地址会发生改变,变成第二次请求的地址,而转发地址不会改变,还是第一次请求的地址。
- 转发是服务器行为,重定向是客户端行为。
- 重定向时的网址可以是任何的网址,转发的网址必须是本站点的网址
请求转发可通过两种方式实现: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>
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术