zoukankan      html  css  js  c++  java
  • 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";
    	}
    }
  • 相关阅读:
    读写锁操作(ReaderWriterLockSlim)
    VirtualBox的小秘密:命令行
    云的始祖概念,认识Linux瘦客户机
    Flash ActionScript 3.0 通过asp.net 访问 数据库
    js刷新iframe框架的几种情况分析
    Mozilla两款火狐插件包含恶意代码被紧急喊停
    asp.net中DataBinder.Eval的用法总结
    实现firebird的Embedded模式(.net 3.5)
    Flash Player 9 支持H.264视频和aac音频(附官方代码)
    右下角浮动广告代码DEMO
  • 原文地址:https://www.cnblogs.com/zhangym/p/5551279.html
Copyright © 2011-2022 走看看