javaWeb(十四)页面向服务器发送请求的四个方式、通过反射机制实现通用Servlet

之前我们是页面传一个请求过来,我们就写一个servlet,很麻烦,这次用反射机制直接实现通用BaseServlet,然后我们自己创建根据请求创建的servlet只要继承BaseServlet,然后我们只要在页面请求里写上我们需要处理的方法(增删改查),直接在这个servlet里实现就行了


本文设计知识点:

  1. 页面向服务器发送请求的三个方式
  2. Servlet生命周期(就是怎么实现的)
  3. 反射机制:javaSE (四十一)反射的概念

1、页面向服务器发送请求的三个方式:

  • 表单提交(这里还有个小知识点:submit和button的区别)
  • 超链接
  • Jquey-Ajax
  • JavaScript的匿名函数的方式

2、Servlet生命周期和反射机制:

  • 页面发送请求,调用无参构造先创建一个servlet对象,然后对象调用init方法初始化,调用service()方法(这里需要向父类查找,然后由父类通过页面的信息决定是doGet还是doPost),然后执行服务器执行destory (具体请看博文: Servlet生命周期 和下面的源码)
    在这里插入图片描述

  • 反射机制就是我拿到该类的字节码文件.class,直接找字节码文件里面的方法,不需要再通过创建实例这么繁琐了,可以在编译阶段做很多事(比如之前做过的泛型擦除)(getMothod和invoke方法很重要

  • 我们这里不需要doGet和doPost方法了,这两个就是父类Service方法就是名字不同罢了,直接写我们自己的方法,然后具体找哪个方法写在BaseServlet的Service里面,让他找我们子类里面的方法(写的有点啰嗦)

下面写个代码演示一下:

登陆页面:

在这里插入图片描述

代码:

扫描二维码关注公众号,回复: 4859608 查看本文章
 <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("检查学生");;

	}

}

猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/85373140