实现javaWeb对数据库的增删改查-MVC开发思想-Controller层之不同的请求使用一个Servlet的原理

  • 1.项目简介

从jsp或者html发送请求给Servlet,这些请求包含数据的增删改查,如果每个功能都写一个Servlet,那显得也太不上档次了。

因此,如何实现页面发送的增删改查等不同的请求,用同一个Servlet来处理呢?

  • 1.1解决方案一:使用Get方式发送请求能够自定义携带参数的特性

  • 1.1.1原理图

  • 1.1.2具体实现

在WebContent目录下新建test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="customerServlet?method=add" >添加</a>
	<a href="customerServlet?method=delete" >删除</a>
	<a href="customerServlet?method=modify" >修改</a>
	<a href="customerServlet?method=query" >查询</a>
</body>
</html>

在src目录下新建一个包com.njupt.javaweb.servlet,并在其下创建CustomerServlet.java,映射为/customerServlet

package com.njupt.javaweb.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CustomerServlet
 */
@WebServlet("/customerServlet")
public class CustomerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String method = request.getParameter("method");
		switch(method) {
			case "add":
				this.add(request, response);
				break;
			case "delete":
				this.delete(request, response);
				break;
			case "modify":
				this.modify(request, response);
				break;
			case "query":
				this.query(request, response);
				break;
			default:
				this.Error(request, response);
				break;
		}
	}
	private void add(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("add");
	}
	private void delete(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("delete");
	}
	private void modify(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("modify");
	}
	private void query(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("query");
	}
	private void Error(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("error");
	}

}

至此,点击不同的超链接,就会调用不同的方法

  • 1.2解决方案二:利用映射Servlet中通配符的特性以及反射

  • 1.2.1原理图

  • 1.2.2具体实现

在WebContent目录下新建test2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="add.do" >添加</a>
	<a href="delete.do" >删除</a>
	<a href="modify.do" >修改</a>
	<a href="query.do" >查询</a>
</body>
</html>

在src目录下的com.njupt.javaweb.Servlet包下新建Servlet  CustomerServlet2.java 映射路径为*.do

package com.njupt.javaweb.servlet;

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;

/**
 * Servlet implementation class CustomerServlet2
 */
@WebServlet("*.do")
public class CustomerServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//获取请求的ServletPath 如/add.do
		String servletPah = request.getServletPath();
		//截取字符串 如 /add.do-------->add
		String methodName = servletPah.substring(1, servletPah.length()-3);
		System.out.println(methodName);
		try {
			//利用反射获取对应的方法
			Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			//调用对应的方法
			method.invoke(this,request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			//这里进行错误处理,如果请求的页面没有对应的方法,重定向到错误页面
			//e.printStackTrace();
			this.Error(request, response);
		} 
	}
	private void add(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("add");
	}
	private void delete(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("delete");
	}
	private void modify(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("modify");
	}
	private void query(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("query");
	}
	private void Error(HttpServletRequest request, HttpServletResponse response){	
		System.out.println("error");
	}
}

至此,点击不同的超链接,就会调用不同的方法

猜你喜欢

转载自blog.csdn.net/qq_23937341/article/details/81453539
今日推荐