利用反射实现Servlet公共类的抽取
一次请求的执行过程:
请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用该servlet的init方法-->发现没有-->从其父类HttpServlet找init,还是没有-->再找其父类GenericServlet,有init,调用该init方法加载当前servlet类-->调用当前servlet的service方法-->发现没有,找父类HttpServlet-->父类有该方法,调用它,service中获取请求方式-->然后调用do post()方法,当前servlet的do post()方法-->最后销毁,调用disdroy。嗯,其实调用父类的init,service方法这种说貌似不妥,应该是调用继承自父类的这两个方法
对原本的service方法进行重写,利用反射调用子类的具体执行方法
package com.jixh.ss.web.base; import java.io.IOException;
import java.lang.reflect.Method; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class BaseServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // localhost:8080/store/productServlet?method=updateUser,url中必须带有所要调用的子类具体方法的方法名
String method = req.getParameter("method"); if (null == method || "".equals(method) || method.trim().equals("")) {
method = "execute";
} // 注意:此处的this代表的是子类的对象
// System.out.println(this);
// 子类对象字节码对象
@SuppressWarnings("rawtypes")
Class clazz = this.getClass(); try {
// 查找子类对象对应的字节码中的名称为method的方法.这个方法的参数类型是:HttpServletRequest.class,HttpServletResponse.class
@SuppressWarnings("unchecked")
Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
if(null!=md){
String jspPath = (String)md.invoke(this, req, resp);
if (null != jspPath) {
req.getRequestDispatcher(jspPath).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
} } // 默认方法
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
return null;
} }
子类Servlet只进行具体的业务处理
package com.jixh.ss.web.servlet; import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.jixh.peanut.domian.FirstMenu;
import com.jixh.peanut.domian.User;
import com.jixh.peanut.domian.UserPower;
import com.jixh.peanut.service.MenueService;
import com.jixh.peanut.service.UserService;
import com.jixh.peanut.service.impl.MenueServiceImpl;
import com.jixh.peanut.service.impl.UserServiceImpl;
import com.jixh.peanut.util.DateUtils;
import com.jixh.peanut.util.UUIDUtils;
import com.jixh.peanut.web.base.BaseServlet; import net.sf.json.JSONObject; public class userServlet extends BaseServlet {
private static final long serialVersionUID = 1L; // 修改用户
public String updateUser(HttpServletRequest request, HttpServletResponse response) {
try {
// 允许跨域访问的响应头
response.setHeader("Access-Control-Allow-Origin", "*"); String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户名密码
UserService userService = new UserServiceImpl();
User user = userService.userLoging(username, password);
if (user != null) {
// 验证通过,进行下一步
String uid = (String) request.getSession().getAttribute("thisUser");
String utype = request.getParameter("utype");
int ustate = Integer.parseInt(request.getParameter("ustate"));
String powerIdArray = request.getParameter("powerIdArray");
System.out.println(uid+"=="+username + "==" + password + "==" + utype + "==" + ustate + "==" + powerIdArray);
//修改用户表
boolean result = userService.updateUser(uid, utype, ustate);
System.out.println("修改用户结果为"+result);
if(result) {
response.getWriter().write("success");
}else {
response.getWriter().write("faild");
}
} else {
// 直接响应
response.getWriter().write("error");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
利用反射实现Servlet公共类的抽取的更多相关文章
- 如何利用反射简化Servlet操作
如何利用反射简化Servlet操作 一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...
- Android利用反射机制为实体类属性赋值
在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的 ...
- [转]C#利用反射实现两个类的对象之间相同属性的值的复制
本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...
- C# 利用反射根据类名创建类的实例对象
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
- 【转】C# 利用反射根据类名创建类的实例对象
原文地址:https://www.cnblogs.com/feiyuhuo/p/5793606.html “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System ...
- c# 利用反射动态给实体类对象赋值
转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...
- 利用反射api查找一个类的具体信息
讲到这个实例,首先介绍下本人,我是一个php程序猿.从事drupal开发2年多.能够说从实习開始就接触这个,至今没有换过.drupal给我的感觉是俩字"强大",今天写一个views ...
- 利用反射优化Servlet抽象出父类BaseServlet
在编写servlet的时候发现每个servlet里面的doPost方法都如: protected void doPost(HttpServletRequest request, HttpServlet ...
随机推荐
- Obfuscating computer code to prevent an attack
A method and system for obfuscating computer code of a program to protect it from the adverse effect ...
- Qt资料大全
简述 发福利了.发福利了.发福利了,重要的事情说三遍... 为了方便更多Qter了解.学习Qt,现将相关资源进行整理,主要内容包括:Qt官网.编码风格.GitHub & Third-Party ...
- Vim 批量替换
假设在非Win系统下. 想批量替换文本不再是Ctrl+F那么简单了, 一般用Vim来做批量替换, 略微复杂点: 比如将192.168.0.1替换为192.168.0.2 :%s/192.168.0.1 ...
- Seq和Ack
http://blog.csdn.net/bytebai/article/details/21752925 握手阶段: 序号 方向 seq ack1 A-& ...
- MDNS DDoS 反射放大攻击——攻击者假冒被攻击者IP向网络发送DNS请求,域名为“_services._dns-sd._udp.local”,这将引起本地网络中所有提供服务的主机都向被攻击者IP发送DNS响应,列举网络中所有服务
MDNS Reflection DDoS 2015年3月,有报告叙述了mDNS 成为反射式和放大式 DDoS 攻击中所用媒介的可能性,并详述了 mDNS 反射式攻击的原理和相应防御方式.Q3,Akam ...
- springboot 注入xml自定义类
新建入口类可扫描类: @Configuration @ImportResource(locations = {"classpath:spring-bean.xml"}) publi ...
- POJ 3666 DP
题意: 思路: dp[i][j] 表示前i + 1个数变成单调且最后一个数是B[j],此时的最小成本 dp[i][j] = min(dp[i – 1][k]) + |A[i] – B[j]| [k = ...
- Metasploit的三种启动方式
不多说,直接上干货! 注意:博主我用的是Kali linux 2016.2(Rolling). msfcli 的启动 root@kali:~# msfcli -h bash: msfcli: 未找到 ...
- 51Nod 最长的循环节(打表预处理)
正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数. 1/6= ...
- Ubuntu18.04 更改GRUB引导菜单背景图片和默认启动项
一.更改GRUB引导菜单背景图片1.首先准备一张想要的照片,文件名是啥无所谓,只要格式是*.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.tga *.TGA都行,都能自动 ...