BaseServlet

Java web----BaseServlet,web----baseservlet

1 BaseServlet的作用

在开始客户管理系统之前,我们先写一个工具类:BaseServlet。

我们知道,写一个项目可能会出现N多个Servlet,而且一般一个Servlet只有一个方法(doGet或doPost),如果项目大一些,那么Servlet的数量就会很惊人。

为了避免Servlet的“膨胀”,我们写一个BaseServlet。它的作用是让一个Servlet可以处理多种不同的请求。不同的请求调用Servlet的不同方法。我们写好了BaseServlet后,让其他Servlet继承BaseServlet,例如CustomerServlet继承BaseServlet,然后在CustomerServlet中提供add()、update()、delete()等方法,每个方法对应不同的请求。

2 BaseServlet分析

我们知道,Servlet中处理请求的方法是service()方法,这说明我们需要让service()方法去调用其他方法。例如调用add()、mod()、del()、all()等方法!具体调用哪个方法需要在请求中给出方法名称!然后service()方法通过方法名称来调用指定的方法。

无论是点击超链接,还是提交表单,请求中必须要有method参数,这个参数的值就是要请求的方法名称,这样BaseServlet的service()才能通过方法名称来调用目标方法。例如某个链接如下:

<a href=”/xxx/CustomerServlet?method=add”>添加客户</a>

3  代码实例

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>AServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.BServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AServlet</servlet-name>
    <url-pattern>/AServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BServlet</servlet-name>
    <url-pattern>/BServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
package cn.itcast.web.servlet;

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 abstract class BaseServlet extends HttpServlet {
	public void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		/*
		 * 1. 获取参数,用来识别用户想请求的方法
		 * 2. 然后判断是否哪一个方法,是哪一个我们就调用哪一个
		 */
		String methodName = req.getParameter("method");

		if(methodName == null || methodName.trim().isEmpty()) {
			throw new RuntimeException("您没有传递method参数!无法确定您想要调用的方法!");
		}

		/*
		 * 得到方法名称,是否可通过反射来调用方法?
		 * 1. 得到方法名,通过方法名再得到Method类的对象!
		 *   * 需要得到Class,然后调用它的方法进行查询!得到Method
		 *   * 我们要查询的是当前类的方法,所以我们需要得到当前类的Class
		 */
		Class c = this.getClass();//得到当前类的class对象
		Method method = null;
		try {
			method = c.getMethod(methodName,
					HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("您要调用的方法:" + methodName + "(HttpServletRequest,HttpServletResponse),它不存在!");
		}

		/*
		 * 调用method表示的方法
		 */
		try {
			String result = (String)method.invoke(this, req, resp);
			/*
			 * 获取请求处理方法执行后返回的字符串,它表示转发或重定向的路径!
			 * 帮它完成转发或重定向!
			 */
			/*
			 * 如果用户返回的是字符串为null,或为"",那么我们什么也不做!
			 */
			if(result == null || result.trim().isEmpty()) {
				return;
			}
			/*
			 * 查看返回的字符串中是否包含冒号,如果没有,表示转发
			 * 如果有,使用冒号分割字符串,得到前缀和后缀!
			 * 其中前缀如果是f,表示转发,如果是r表示重定向,后缀就是要转发或重定向的路径了!
			 */
			if(result.contains(":")) {
				// 使用冒号分割字符串,得到前缀和后缀
				int index = result.indexOf(":");//获取冒号的位置
				String s = result.substring(0, index);//截取出前缀,表示操作
				String path = result.substring(index+1);//截取出后缀,表示路径
				if(s.equalsIgnoreCase("r")) {//如果前缀是r,那么重定向!
					resp.sendRedirect(req.getContextPath() + path);
				} else if(s.equalsIgnoreCase("f")) {
					req.getRequestDispatcher(path).forward(req, resp);
				} else {
					throw new RuntimeException("你指定的操作:" + s + ",当前版本还不支持!");
				}
			} else {//没有冒号,默认为转发!
				req.getRequestDispatcher(result).forward(req, resp);
			}
		} catch (Exception e) {
			System.out.println("您调用的方法:" + methodName + ", 它内部抛出了异常!");
			throw new RuntimeException(e);
		}
	}
}
package cn.itcast.web.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 在这里给出多个请求处理方法
 * 请求处理方法:除了名称以外,都与service方法相同!
 * @author cxf
 *
 */
public class AServlet extends BaseServlet {
	public void addUser(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("addUser()...");
		throw new IOException("测试一下");
	}

	public void editUser(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("editUser()...");
	}

	public void deleteUser(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("deleteUser()...");
	}

	public void loadUser(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("loadUser()...");
	}

	public void findAll(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("findAll()...");
	}
}
package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends BaseServlet {
	public String fun1(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("fun1()...");
		return "/index.jsp";
	}

	public String fun2(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("fun2()...");
		return "r:/index.jsp";
	}

	public String fun3(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("fun3()...");
		return "d:/WEB-INF/files/a.rmvb";
	}
}
时间: 2024-10-13 17:24:20

BaseServlet的相关文章

网上图书商城项目学习笔记-037工具类之BaseServlet及统一中文编码

1.统一中文编码分析 tomcat默认esetISO-8859-1编码,在servlet中,可能通过request的setCharacterEncoding(charset)和response.setContentType("text/html;charset=UTF-8");处理post请求编码,但get请求的编码控制不了,所以,如果请求类型是get,则用装饰者模式把request整个调包 2.EncodingFilter.java 1 package cn.itcast.filte

关于BaseServlet那些事

@为什么需要BaseServlet?  我们知道一个POST或者GET提交对应着一个Servlet, 无数的提交会让Servlet页面增加,我们希望一个Servlet就能处理很多提交的请求. @BaseServlet 是一个继承了HttpServlet的普通类,并不是Servlet类,所以不需要在web.xml中添加路径.但是Servlet会继承这个BaseServlet来实现一个Servlet处理多个提交请求 . @一些要求 是: 客户端发送请求时,必须提供一个参数(本文编写的这个参数名字叫m

BaseServlet使用方法

一般Servlet都是只有一个请求处理方法 * 登录:一个LoginServlet * 注册:一个RegistServlet * 修改密码:... 我们需要一个Servlet有多个请求处理方法 * login() * regist() * updatePassword() 让你的Servlet去继承BaseServlet * BaseServlet: *  1. 可以有多个请求处理方法 *  2. 简化了转发和重定向的代码 * *  请求处理方法格式: *  public String regi

BaseServlet方法分发

BaseServlet.java 1 package org.guangsoft.controller; 2 3 import java.io.IOException; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpS

【WEB小工具】BaseServlet—一个Servlet处理多个请求

1 package cn.itcast.test.web.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.ser

BaseServlet的抽取

在开发中,对页面的请求要创建对个servlet来进行处理,一个servlet只能处理一个请求,这样要创建多个servlet,不利于开发和以后程序的维护,我们可以对同一个模块进行合并创建一个servlet即可,比如登录模块,商品模块,订单模块等等.只需要他们继承BaseServlet,并在前台页面传递所调用的方法名即可. package cn.itcast.stroe.utils; import java.io.IOException; import java.lang.reflect.Invoc

BaseServlet 继承 httpServlet

BaseServlet   核心 1 package cn.core; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.

day18(JDBC事务&连接池介绍&DBUtils工具介绍&BaseServlet作用)

day18总结 今日思维导图: 今日内容 事务 连接池 ThreadLocal BaseServlet自定义Servlet父类(只要求会用,不要求会写) DBUtils à commons-dbutils ? 事务 ? 事务的四大特性:ACID: mysql中操作事务 jdbc中操作事务 ? ? ? 事务概述 为了方便演示事务,我们需要创建一个account表: CREATE TABLE account( ????id INT PRIMARY KEY AUTO_INCREMENT, ????NA

简易版自定义BaseServlet

这几天在学Java Web,一直在思考Servlet重用的问题,就用java的反射机制实现自定义的简易版BaseServlet; 该方式有点像struts2 利用映射获取前端的参数.有兴趣的同学可以自行添加别的类的判断 直接上代码,映射方式被我封装成了一个BaseServlet BaseServlet.java public class BaseServlet extends HttpServlet{ private HttpServletRequest req; private HttpSer