之前我们是页面传一个请求过来,我们就写一个servlet,很麻烦,这次用反射机制直接实现通用BaseServlet,然后我们自己创建根据请求创建的servlet只要继承BaseServlet,然后我们只要在页面请求里写上我们需要处理的方法(增删改查),直接在这个servlet里实现就行了
本文设计知识点:
- 页面向服务器发送请求的三个方式
- Servlet生命周期(就是怎么实现的)
- 反射机制:javaSE (四十一)反射的概念
1、页面向服务器发送请求的三个方式:
- 表单提交(这里还有个小知识点:submit和button的区别)
- 超链接
- Jquey-Ajax
- JavaScript的匿名函数的方式
2、Servlet生命周期和反射机制:
-
页面发送请求,调用无参构造先创建一个servlet对象,然后对象调用init方法初始化,调用service()方法(这里需要向父类查找,然后由父类通过页面的信息决定是doGet还是doPost),然后执行服务器执行destory (具体请看博文: Servlet生命周期 和下面的源码)
-
反射机制就是我拿到该类的字节码文件.class,直接找字节码文件里面的方法,不需要再通过创建实例这么繁琐了,可以在编译阶段做很多事(比如之前做过的泛型擦除)(getMothod和invoke方法很重要)
-
我们这里不需要doGet和doPost方法了,这两个就是父类Service方法就是名字不同罢了,直接写我们自己的方法,然后具体找哪个方法写在BaseServlet的Service里面,让他找我们子类里面的方法(写的有点啰嗦)
下面写个代码演示一下:
登陆页面:
代码:
<head>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function fn(){
$.post("/BaseServletTest/ServletDemo01",{"method":"checkStu"},function(data,status){
alert(data);
});
}
</script>
</head>
<body>
<!-- 方式一:使用表单提交 -->
<form action="/BaseServletTest/ServletDemo01?method=addStu" method="post">
name:<input type="text" name="name"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="添加学生">
</form>
<!-- 方式二:超链接提交 -->
<a href="/BaseServletTest/ServletDemo01?method=deleteStu">删除学生</a><br>
<!-- 方式三:jquery-Ajax -->
<button onclick="fn()">这是Jq按钮</button>
</body>
</html>
<!-- 方式四: 整个是个表单,但是有很多提交的按钮,不同按钮提交到不同的地方,这里需要用到js的方法 -->
<script type="text/javascript">
$(function(){
$("#按钮的id").click(function(){
var formObj = document.getElementById("form的id");
formObj.action="提交的地址";
formObj.method="提交的方式";
});
});
BaseServlet:
package cn.nupt.BaseSer;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BaseServlet")
public class BaseServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
// 从页面那里获得method的值,确定用什么servlet方法
String md = request.getParameter("method");
// 转到这个servlet后会先调用无参构造创建一个对象,获取当前对象的字节码对象
Class<? extends BaseServlet> clazz = this.getClass();
Method method = clazz.getMethod(md, HttpServletRequest.class, HttpServletResponse.class);
String path = null;
if (method != null) {
// 参数1:类的对象 ;参数2:调用上面的方法的参数值(注意顺序)
path = (String) method.invoke(this, request, response);
}
if (path != null) {
request.getRequestDispatcher(path).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试Servlet,继承了BaseServlet
package cn.nupt.BaseSer;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo01")
public class ServletDemo01 extends BaseServlet {
private static final long serialVersionUID = 1L;
public String addStu(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("添加学生");
return "index.jsp";
}
public String deleteStu(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("删除学生");
return "index.jsp";
}
public void checkStu(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("检查学生");;
}
}