利用 JSP 中的反射机制封装一个 Servlet ,就不用每张表的每个方法都写一个 Servlet
2017-07-21 18:50
441 查看
基类 Servlet 代码如下:
package com.yibin.cn.servlet;
import java.awt.print.Printable;
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 {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// post中文乱码处理
request.setCharacterEncoding("utf-8");
// 响应到客户端的乱码处理
response.setCharacterEncoding("utf-8");
// 响应到客户端的头部乱码处理
response.setContentType("text/html;charset=UTF-8");
//获取动作参数
String action = request.getParameter("action");
System.out.println(action);
if(action==null||"".equals(action.trim())){//参数为空或空字符串.
response.getWriter().print("你提交的是非法参数");
return;
}
//反射机制:反射可以做未来不确定的事情。用反射机制得到该对象的方法对象。
Method method;
try {
//获取本类方法,传递参数:动作、参数类型。
method = this.getClass().getMethod(action, HttpServletRequest.class,HttpServletResponse.class);
//通过method方法对象调用方法
//User user = new User();
//user.getName();
method.invoke(this, request,response);//this调用method,传递参数request和response。
} catch (Exception e) {
System.out.println("你提交的是非法参数");
e.printStackTrace();
}
}
}用户表的Servlet代码如下(可以直接实现本表需要的各个操作,继承自基类(实现了反射机制以及乱码处理)):
package com.yibin.cn.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import utils.Page;
import com.yibin.cn.dao.entity.User;
import com.yibin.cn.service.IUserService;
import com.yibin.cn.service.impl.UserServiceImpl;
public class UserServlet extends BaseServlet {
// 登录
public void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("login方法被调用");
// 1、获取数据
// 2、封装数据
// 3、调用API
// 4、控制跳转
}
// 增
public void add(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("add方法被调用");
// 获取数据
}// 改public void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("update方法被调用");
}// 查public void listAll(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("listAll方法被调用");
}// 分页public void getPage(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("getPage方法被调用");
}}
如上,原来一个方法需要写一个 servlet,现在都封装到一个表名命名的servlet了,既方便,结构又清晰,调用如下所示:
request.getRequestDispatcher("UserServlet?action=delete").forward(request, response);
通过跳转到指定方法来调用,主要要传递动作参数 "action" ,然后 BaseServlet 利用反射机制就会帮你调用对应的方法,是不是很方便呢。
对了,servlet还需要配置,在工程目录:工程名/WebContent/WEB-INF/web.xml 加上以下代码:
<!-- 基类Servlet -->
<servlet>
<servlet-name>BaseServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.BaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BaseServlet</servlet-name>
<url-pattern>/BaseServlet</url-pattern>
</servlet-mapping>
<!-- 通用UserServlet -->
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
至此大功告成!
package com.yibin.cn.servlet;
import java.awt.print.Printable;
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 {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// post中文乱码处理
request.setCharacterEncoding("utf-8");
// 响应到客户端的乱码处理
response.setCharacterEncoding("utf-8");
// 响应到客户端的头部乱码处理
response.setContentType("text/html;charset=UTF-8");
//获取动作参数
String action = request.getParameter("action");
System.out.println(action);
if(action==null||"".equals(action.trim())){//参数为空或空字符串.
response.getWriter().print("你提交的是非法参数");
return;
}
//反射机制:反射可以做未来不确定的事情。用反射机制得到该对象的方法对象。
Method method;
try {
//获取本类方法,传递参数:动作、参数类型。
method = this.getClass().getMethod(action, HttpServletRequest.class,HttpServletResponse.class);
//通过method方法对象调用方法
//User user = new User();
//user.getName();
method.invoke(this, request,response);//this调用method,传递参数request和response。
} catch (Exception e) {
System.out.println("你提交的是非法参数");
e.printStackTrace();
}
}
}用户表的Servlet代码如下(可以直接实现本表需要的各个操作,继承自基类(实现了反射机制以及乱码处理)):
package com.yibin.cn.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import utils.Page;
import com.yibin.cn.dao.entity.User;
import com.yibin.cn.service.IUserService;
import com.yibin.cn.service.impl.UserServiceImpl;
public class UserServlet extends BaseServlet {
// 登录
public void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("login方法被调用");
// 1、获取数据
// 2、封装数据
// 3、调用API
// 4、控制跳转
}
// 增
public void add(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("add方法被调用");
// 获取数据
// 2、封装数据 // 3、调用API // 4、控制跳转}// 删public void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("delete方法被调用");
// 获取数据
// 2、封装数据 // 3、调用API // 4、控制跳转
}// 改public void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("update方法被调用");
// 获取数据
// 2、封装数据 // 3、调用API // 4、控制跳转
}// 查public void listAll(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("listAll方法被调用");
// 获取数据
// 2、封装数据 // 3、调用API // 4、控制跳转
}// 分页public void getPage(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("getPage方法被调用");
// 获取数据
// 2、封装数据 // 3、调用API // 4、控制跳转
}}
如上,原来一个方法需要写一个 servlet,现在都封装到一个表名命名的servlet了,既方便,结构又清晰,调用如下所示:
request.getRequestDispatcher("UserServlet?action=delete").forward(request, response);
通过跳转到指定方法来调用,主要要传递动作参数 "action" ,然后 BaseServlet 利用反射机制就会帮你调用对应的方法,是不是很方便呢。
对了,servlet还需要配置,在工程目录:工程名/WebContent/WEB-INF/web.xml 加上以下代码:
<!-- 基类Servlet -->
<servlet>
<servlet-name>BaseServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.BaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BaseServlet</servlet-name>
<url-pattern>/BaseServlet</url-pattern>
</servlet-mapping>
<!-- 通用UserServlet -->
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
至此大功告成!
相关文章推荐
- 利用反射机制得到一个类的方法,变量,以及构造函数
- 深度复制一个对象方法。利用反射机制,不使用Serialization,也不使用ICloneable接口
- (原创)利用扩展方法,给 IEnumerable<T> 增加一个生成 Html 的 CheckBox 标签的方法,不用 C# 中的反射技术
- java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表
- 如何利用反射机制实现前台页面共用一个servlet文件
- 利用反射机制编写一个程序,这个程序能指定调用类的某个方法及构造方法,并把操作信息输出到控制台。
- (原创)利用扩展方法,给 IEnumerable<T> 增加一个生成 Html 的 select 标签的方法,不用 C# 中的反射技术
- 一个servlet处理多个请求 (利用反射获取方法)
- 利用java 反射机制来实现一个servlet处理多种请求
- 利用Java的反射机制解析一个Class对象的详细内容(工具方法留用)
- poi利用反射机制封装导出方法
- jsp+servlet文件上传以及request提交数据利用反射封装到实力类中
- java利用反射来调用一个类的私有方法
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- 图解利用Eclipse3+Lomboz3+Tomcat开发JSP -- 4.一个Servlet实例
- 设计技巧11:静态创建方法(非设计模式中的工厂方法) 利用一个静态的方法封装构建器
- 写一个MyORM--利用反射的方法
- 利用java的反射机制调用类的私有方法及私有属性
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- 如何利用反射去访问一个私有的方法