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反射机制
- java 反射机制-学习笔记(5)
- Java反射机制学习笔记(一)
- Java反射机制(学习笔记)
- java 反射机制-学习笔记(1)
- java 反射机制-学习笔记(2)
- java 反射机制-学习笔记(3)
- java 反射机制-学习笔记(4)
- java 反射机制-学习笔记(6)
- java 反射机制-学习笔记(7)
- java 反射机制-学习笔记(8)
- java 反射机制-学习笔记(9)
- Java反射机制学习笔记
- Java 反射机制-学习笔记
- Java反射机制学习笔记
- java反射机制学习笔记
- 【Java学习笔记】-----反射机制
- [学习笔记]Java反射机制
- Java反射机制学习笔记
- PAT乙题1016. 部分A+B (15)
- 英雄联盟2017赛季什么时候结束?
- centos7 安装jenkins
- (转)PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案
- DirectX11笔记(三)--Direct3D初始化代码
- java 反射机制-学习笔记(5)
- PAT乙题1019. 数字黑洞 (20)
- macos 10.13安装python3
- C和指针之部分理解和编码总结
- POJ 1308 (边的个数 等于 结点的个数减一)
- PAT乙题1020. 月饼 (25)
- 大家好,给大家介绍一下,这是我的女朋友@代码
- __VA_ARGS__用法(转)
- C语言 ## __VA_ARGS__ 宏