一次请求的执行过程:

请求:发送请求地址-->到达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公共类的抽取的更多相关文章

  1. 如何利用反射简化Servlet操作

    如何利用反射简化Servlet操作   一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...

  2. Android利用反射机制为实体类属性赋值

    在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...

  3. C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

    转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的 ...

  4. [转]C#利用反射实现两个类的对象之间相同属性的值的复制

    本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...

  5. C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  6. 【转】C# 利用反射根据类名创建类的实例对象

    原文地址:https://www.cnblogs.com/feiyuhuo/p/5793606.html “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System ...

  7. c# 利用反射动态给实体类对象赋值

    转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...

  8. 利用反射api查找一个类的具体信息

    讲到这个实例,首先介绍下本人,我是一个php程序猿.从事drupal开发2年多.能够说从实习開始就接触这个,至今没有换过.drupal给我的感觉是俩字"强大",今天写一个views ...

  9. 利用反射优化Servlet抽象出父类BaseServlet

    在编写servlet的时候发现每个servlet里面的doPost方法都如: protected void doPost(HttpServletRequest request, HttpServlet ...

随机推荐

  1. JAVA关于byte数组与String转换的问题

    1 public class ToString{ public static void main(String[] args){ String aa = "hellow"; byt ...

  2. Postman(API & HTTP请求调试插件)

    简述 Postman是一个Chrome扩展,提供功能强大的Web API & HTTP请求调试.它能够发送任何类型的HTTP 请求(GET.HEAD.POST.PUT..),附带任何数量的参数 ...

  3. 【Android应用开发技术:基础构建】命令行下的Android应用开发

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  4. 编写SDR SDRAM页突发模式控制器的注意点

    网上有很多的SDR SDRAM控制器的代码,但都是基于burst1/2/4/8模式下的,这种模式下传输高速的相机数据还是有点拮据的,所以花了几天把这些模式改造成了页突发模式.我的这个控制器模型是这样的 ...

  5. thinkphp5项目--个人博客(八)

    thinkphp5项目--个人博客(八) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...

  6. 【转】dig详解

    [root@localhost ~]# dig www.a.com ; <<>> DiG 9.2.4 <<>> www.a.com ;; global ...

  7. kali 2.0 linux中的Nmap的操作系统扫描功能

    不多说,直接上干货! 可以使用-O选项,让Nmap对目标的操作系统进行识别. msf > nmap -O 202.193.58.13 [*] exec: nmap -O 202.193.58.1 ...

  8. 如何设定editplus为txt默认打开程序?

    如何设定editplus为txt默认打开程序? 如图操作即可:

  9. PostgreSQL Replication之第九章 与pgpool一起工作(5)

    9.5 检查复制 如果所有的节点都处于开机并运行的状态.我们就可以在集群上运行我们的第一个操作了.在我们的例子中,我们将简单地连接到pgpool并创建一个新的数据库.createdb 是一个命令行工具 ...

  10. HDU 5223 GCD

    题意:给出一列数a,给出m个区间,再给出每个区间的最小公倍数 还原这列数 因为数组中的每个数至少都为1,而且一定是这个区间的最小公约数ans[i]的倍数,求出它与ans[i]的最小公倍数,如果大于1e ...