创建Servlet基类,用于解决由于业务太多,来编写太多是Servlet类。--模板设计模式

  在编写后台代码的过程中,如果应用Servlet进行编写,对于业务逻辑较多的项目,需要编写许多的Servlet

类,来进行接收前端传到后台的request和response,并调用业务层,对数据进行处理。 

针对大量的Servlet。我们可以写一个基类,就可以将业务写在一个Servlet类中,并且此Servlet用来继承写好的基类。所以写这个基类需要判断要调用哪一个方法。

我来写一下演化的过程:

 首先: 

如果我想用一个Servlet来解决需要的业务请求其实不用基类的的方法也不是不可以完成的,我们可以在前端传到后台方法的名字

<form action="${ pageContext.request.contextPath }/userServlet?method=register" method="post">

,应用request.getParameter("method")方法获得方法,然后通过if判断让哪一个方法进行执行,逻辑代码为:

public class UserServlet extends HttpServlet{
    public void service(HttpServletRequest req,HttpServletResponse resp){
        // 接收参数:
        String methodName = request.getParameter(“method”);
        if(“regist”.equals(methodName)){
            regist(req,resp);
        }else if(“login”.equals(methodName)){
            login(req,resp);
       }
   }

   public void regist(HttpServletRequest req,HttpServletResponse resp){

   }
   public void login(HttpServletRequest req,HttpServletResponse resp){

   }
}

  但是这样如果我有很多方法的时候,也就是有 很多业务需要处理的时候就会大量的if语句,用来进行判断,我们可不可将这些判断封装到一个模板类里面,然后再去写一个Servlet类集成这个模板类呢,这就出现了这个基类,运用的是模板设计模式:以下为具体的模板实现:

<font>会员注册</font>USER REGISTER
				<form class="form-horizontal" style="margin-top: 5px;"
					action="${ pageContext.request.contextPath }/userServlet?method=register"
					method="post">
					<input type="hidden" name="uid" value="<%=UUIDUtils.getID()%>">
					<div class="form-group">
						<label for="username" class="col-sm-2 control-label">用户名</label>
						<div class="col-sm-6">
							<input type="text" class="form-control" id="username"
								name="username" placeholder="请输入用户名">
						</div>
						<span id="usernameInfo"></span>
					</div>

package com.lhy.utils;

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;

//创建一个普通的类来继承HttpServlet
public class BaseServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 处理request编码问题
		if ("post".equalsIgnoreCase(req.getMethod())) {
			req.setCharacterEncoding("UTF-8");
		} else {

		}
		// 处理response编码问题
		resp.setContentType("text/html;charset=utf-8");

		// 获得要去运行的Servlet方法的名称
		String methodName = req.getParameter("method");
		if (methodName == null || "".equals(methodName)) {
			resp.getWriter().println("method参数为null!!!");
			return;
		}
		// 获取子类的class对象
		Class clazz = this.getClass();
		// 获得子类中要去执行的方法
		try {
			Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			// 设置一个返回值,接收将继承BaseServlet的子类的返回值,用来进行接下来的转发,刷新或重定向操作
			String path = (String) method.invoke(this, req, resp);
			if (path != null) {
				if (path.startsWith(req.getContextPath())) {
					resp.sendRedirect(path);
				} else {
					req.getRequestDispatcher(path).forward(req, resp);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
而具体的子类实现为:
package com.lhy.web.servlet;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

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

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

import com.itheima.domain.User;
import com.itheima.service.RegisterService;
import com.itheima.utils.BaseServlet;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

public class UserServlet extends BaseServlet {

	public String register(HttpServletRequest request, HttpServletResponse response){
		Map<String, String[]> parameterMap = request.getParameterMap();
		User user = new User();
		try {
			// 自己指定一个类型转换器(将String转成Date)
			ConvertUtils.register(new Converter() {

				@Override
				public Object convert(Class clazz, Object value) {
					// 将string转成date
					SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
					Date parse = null;
					try {
						try {
							parse = format.parse(value.toString());
						} catch (java.text.ParseException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (ParseException e) {
						e.printStackTrace();
					}
					return parse;
				}
			}, Date.class);

			// 映射封装
			BeanUtils.populate(user, parameterMap);
			String province = request.getParameter("province");
			String city = request.getParameter("city");
			user.setAddress(province+"-"+city);
		} catch (IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}

		RegisterService rss = new RegisterService();
		boolean flag = false;

		try {
			flag = rss.regiser(user);
		} catch (SQLException e) {
			flag = false;
			System.out.println("SQL异常");
			e.printStackTrace();
		}

		return "/login.jsp";
	}
}
 然后再去调用Service层和Dao层;这样就可以实现将业务模块化,比如和用户有关的就只写UserServlet一个Servlet类,中间可以写需要方法,来处理业务。




 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值