servlet

本文深入解析Servlet与Filter的工作原理及其实现方式,包括初始化过程、业务处理方法、过滤器拦截机制等关键知识点。
获取参数this.getServletConfig().getInitParameters
返回值是Enumeration 《String》enums
while(enums.hasMoreElements(){ String paramName=enums.nextElement();
String paramValue=this.getSevletConfig().getInitParameter(paramName)
//1.tomcat服务器把这些参数会在加载web应用的时候,封装到Servl
etConfig对象中
2、tomcat服务器调用init方法传入ServletConfig对象
public class GenericServlet{
    private transient ServletConfig config;
    public void init(ServletConfig config) throws ServletException{
        this.config=config;
    }
    //在其他Servlet中可以this.getServletConfig中拿到
    public ServletConfig getServletConfig(){
        return config;
    } 
}

加载web应用的时候就会创建ServletContext对象;
从ServletConfig中得到,因为所有servlet都共用一个ServletContext对象

path
e:/a.txt

String path=config.getInitParameter(“path”);
File file=new File(path);
BufferedReader br=new BufferedReader(new FileReader(file));

    public class HelloFilter implements Filter{
        public HelloFilter(){ 
            System.out.println("1.创建过滤器实例");
        }
    public void destroy(){
        System.out.println("6.销毁过滤器实例");
    }
    //过滤器业务处理方法,在请求到达servlet之前先在此方法中处理公共的
    @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("3.执行过滤器业务处理方法");
        arg2.doFilter(arg0, arg1);
        System.out.println("5.执行过滤器业务处理方法");    
    }
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      super.doGet(req, resp);
        System.out.println("4.处理用户请求开始。。。");
    }
}

Servlet与filter启动的区别:
filter是在服务器启动时候创建实例,也就是服务器启动时候自动执行
1.创建实例
2.执行过滤器初始化方法

在访问的时候,执行
3.执行过滤器业务处理方法;
chain.doFilter()
(如果有下一个过滤器,则进入到下一个过滤器,否则执行访问servlet)
4.处理用户请求开始
5.执行过滤器业务处理方法

如果配置了多个过滤器,则按照web.xml中出现的顺序,依次执行,执行完后按照过滤器倒序退回

如果在第一个过滤器中,没有执行doFilter(),那么不会进入到下一个filter

过滤器相关API

Interface

    Filter:
        void init(filterConfig):初始化方法,在服务器启动时候执行
            //获取过滤器在web.xml中配置的初始化参数
            filterConfig.getInitParameter("encoding");

            //filterConfig.getInitParameterNames();
        Enumeration<String> enums=filterConfig.getInitParameterNames();
        while(enums.hasMoreElements()){
            String name=enums.nextElement();
            String value=filterConfig.getInitParameter(name);
        }
        void doFilter(req,res,filterChain):过滤器拦截的业务处理方法
        void destroy()    销毁过滤器实例时候调用

    FilterConfig
        String getFilterName(String name):filter的内部名称;




    FilterChain
        一个个过滤器形成一个执行链           
            唯一的方法:doFilter(req,res):执行下一个过滤器或者放行

过滤器的拦截

1.

/*则是拦截所有的,包含jsp和servlet

2.

/index.jsp则是拦截指定的这个jsp

3.如果需要拦截多个

<url-pattern>/index.jsp</url-pattern>
<url-pattern>/list.jsp</url-pattern>

4.根据servlet的内部名称拦截

<servlet-name>IndexServlet</servlet-name>

5.拦截指定的servlet

<url-pattern>/index</url-pattern>

6.指定拦截指定的类型

默认拦截的类型 
<dispatcher>REQUEST</dispatcher>
拦截转发
<dispatcher>FORWARD</dispatcher>
拦截包含的页面(RequestDispatcher)
<dispatcher>INCLUDE</dispatcher>

拦截声明式异常
<dispatcher>ERROR</dispatcher>

    <error-page>
        <error-code>404</error-code>
        <exception-type></exception-type>
        <location></location>
    </error-page>

过滤器案例

几乎每一个servlet都要涉及编码处理,处理请求数据中文问题。
每个servlet都要做这些操作,把公用的代码抽取-过滤器实现。

代码实现:
1.login.jsp登录,输入“中文”
2.LoginServlet.java 直接处理登录请求
3.EncodingFilter.java:过滤器

对指定接口的某一个方法进行功能扩展,可以使用代理。
对request对象,创建代理对象

chain.doFilter(req,res);
即对request对象创建代理对象
Proxy.newProxyInstance(
req.getClass().getClassLoader(), //指定当前使用的类加载器
//对目标对象实现的接口类型
new Class[]{HttpServletRequest.class},
new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
//定义方法返回值
Object returnValue=NULL;
//获取方法名
String methodName=method.getName();
return null;
}
}
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值