java 反射机制-学习笔记(5)

来源:互联网 发布:dota改键位软件 编辑:程序博客网 时间:2024/05/22 03:45

操作状态

如果仅仅是通过接受参数来 if.else判断执行哪个方法,未免有点繁琐。比如想要执行添加方法或修改方法,那么在提交表单时需要多加一个状态参数status = add或 update 提交到Servlet进行判断。假如可以把状态参数放在请求路径里,那么表单参数提交时就不用额外添加状态参数了。
HttpServletRequest 有个 getRequestURI() 方法正好可以满足这样的需求。

新建 DispatcherServlet 类:

package cn.lyx.servlet;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.lang.reflect.Method;@WebServlet(urlPatterns={"/DispatcherServlet/*"})public class DispatcherServlet extends HttpServlet{    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        String uri = req.getRequestURI();  // 获取请求的路径        String status = uri.substring(uri.lastIndexOf("/")+1);  // 获取路径的最后一段,也就是状态值        Class<?> cls = this.getClass();  //        try{            Method method = cls.getMethod(status);  // 获取指定方法对象            method.invoke(this);  // 执行方法        }catch (Exception e) {            e.printStackTrace();        }    }    public String add(){        System.out.println("执行添加操作");        return "forword.jsp";    }    public String update(){        System.out.println("执行修改操作");        return "forword.jsp";    }    public String delete(){        System.out.println("执行删除操作");        return "forword.jsp";    }}

测试 添加方法,注意路径最后的 add
http://localhost:8080/reflactDemo/DispatcherServlet/add
结果:
添加成功

结果正常。
到这里,JAVA WEB 基本反射常用到的方法就差不多说完了,回顾一下之前写过的Servlet 还有些局限性,比如只能初始化一个对象,因为不能区分是哪个对象。为什么尼,再来回顾一下index.jsp 表单提交:

    <form action="StudentServlet" method="post">        姓名:<input type="text" name="name"><br>        年龄:<input type="text" name="age"><br>        成绩:<input type="text" name="score"><br>        <input type="submit" value="输入">        <input type="reset"  value="重置">    </form>

表单就提交了参数名称,该参数名称必须和要执行对象的属性名一致。然后Servlet 实例化一个对象来接受参数执行setter 操作,此时的对象类型是固定的,因为仅仅通过属性名不能区分对象类型。
这个很不满足实际开发要求,因为不可能所有参数都要放到一个对象处理。假如想指定不同的对象那该怎么办尼,仔细想想,灵感出现。既然参数名可以指定属性名,那么参数名也可以指定实例名,不同实例名就是不同的对象了呀,想想好像可行,怎么做呢?比如参数名是 student.score(学生的分数),student 是Student 类的 实例化名称。teacher.age(老师的年龄) ,teacher 是Teacher 类的实例化名称。Servlet 接受到参数名进行判断就可以调用不同的对象实例。

待续。。。

参考:李兴华-java反射机制

原创粉丝点击