Java Servlet原生调用方法过程简化

初学java web之后,了解了jsp跟Servlet交互的过程。

具体过程如下:

  1. 创建一个servlet,并重写doPost和doGer方法
  2. 在MXL文件中配置servlet的接收请求的路径
  3. 在jsp中请求该路径
  4. 在servlet中写一个方法,在doPost或者doGet方法中判断传递过来的参数来实际调用哪一个方法

 

由上面步骤,我们会发现,如果在一个servlet中写很多方法,那岂不是要写很多判断;

下面是我个人想的简化上面过程的代码,实现了不用写判断,直接根据路径来实现请求的方法

第一步、实现Filter类,获取请求路径,判断请求的是方法还是页面,如果是页面则返回index.jsp

public class FilterDemo implements Filter {

static  Demo demo=null; //serlvet

    @Override

    public void doFilter(ServletRequest arg0, ServletResponse arg1,

            FilterChain chian) throws IOException, ServletException {

        // TODO Auto-generated method stub

            HttpServletRequest req=(HttpServletRequest)arg0;//获取request对象

            HttpServletResponse resp=(HttpServletResponse)arg1;//获取request对象

             String uri = req.getRequestURI();

             if (uri.indexOf(".jsp")<0) {            

                   demo.doGet(req, resp);

            }else{

                resp.sendRedirect("../index.jsp");

               

            }

    }

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        demo=new Demo();

}

}

第二步、实现继承servlet的Demo类

public class Demo  extends HttpServlet{

   

        @Override

        protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                throws ServletException, IOException {

            doPost(req,resp);

        }

 

        @Override

        protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                throws ServletException, IOException {

           

                //---加载类

            try {

                //假如请求路径是 端口/项目名/Main/doPos2

                   //获取请求路径

                String uri = req.getRequestURI();

                //分割请求路径

                //分割之后就是{"",项目名,Main,doPos2}

                   String[] strs=uri.split("/");

                   //获取项目名的后一个路径

                   String str1=strs[2];

                   //获取项目名的后两个路径 --假如路径不存在,则返回404

                   String str2=strs[3];

                   //将包名和str1拼接路径,将类加载--报错则返回404

                   Class<?> c1=null;

                    c1 = Class.forName("com.xj.controller."+str1);

                    //获取无参构造方法

                   Constructor<?> constructor;

                   constructor = c1.getConstructor();

                   //将私有暴露

                   constructor.setAccessible(true);

                   //获取str2方法--报错则返回404

                   Method dd=c1.getDeclaredMethod(str2,HttpServletRequest.class,HttpServletResponse.class);

                   dd.setAccessible(true);

                   //调用方法并传递参数

                   dd.invoke(constructor.newInstance(), req,resp);                   } catch (Exception e) {       

                       resp.sendRedirect("../404.jsp");

                   }

        }

}

 

 

第三步、实现具体的方法

protected void doPos2(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        resp.sendRedirect("/FangTieBa/index.jsp");

}

效果如下:

上述方法重点在于利用反射获取Servlet类和方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值