【知了堂学习笔记】JAVA用反射写一个Servlet简易框架

对servlet实现简单封装

1.servlet实现ajax方式

package com.zlt.opteraction;

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;

/**
 * 前端控制器,目的拦截请求,指派业务控制器去完成功能请求的处理
 * 类似SpringMVC框架中核心控制器的开发
 * 1. 前端控制器具备的功能
 * (1)拦截请求
 * (2)委托业务控制器去完成请求处理
 * (3)将后台的数据传递给视图,视图有数据用户就能在浏览器中看到数据
 * 2. 如何寻找显示数据页面
 * (1)子控制器返回一个页面的地址
 * 3. 如何将数据传递给页面
 * (1)Servlet中转发技术
 * (2)Ajax技术
 * @author caleb
 *
 */
public abstract class BaseServlet extends HttpServlet {

	private static final long serialVersionUID = 174652088543895745L;
	
	public static String PROJECT_REDIRECT; //项目做重定向的根路径,避免重定向时候出现http404错误
	public static String PROJECT_FORWARD; //项目做转发的根路径,避免在转发的过程中找不到页面
	
	@Override
	public void init() throws ServletException { //Servlet初始化会被调用方法
		PROJECT_REDIRECT = "r:" + getServletContext().getContextPath();
		PROJECT_FORWARD = "f:";
	}
	
	/**
	 * service包含doPost和doGet
	 * 凡事POST和GET请求都会走这个方法
	 */
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8"); //解决所有子控制器的乱码问题
		
		String methodName = request.getParameter("method"); //方法名称,等会利用请求去指定方法名称
		Class clazz = this.getClass(); //子类的运行时类
		try {
			if (methodName == null) {
				return; //如果方法名称的参数不存在则终止程序
			}
			Method  method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //子类的方法名称
			String path = (String) method.invoke(this, request, response); //运行子类的方法名称
			
			//得到子控制器返回的页面地址,需要完成下面如下几个响应页面的处理
			//1.Ajax
			//2.页面跳转(重定向),页面地址定义一个以 r:/html/default/edit.html 开头前缀
			//3.转发,页面地址定义一个以 f:/html/default/edit.html 开头前缀
			if (path == null) { //Ajax技术
				return;
			} 
			
			if ("r:".equals(path.substring(0,2))) {
				response.sendRedirect(path.substring(2)); //重定向
			} else if ("f:".equals(path.substring(0, 2))) {
				request.getRequestDispatcher(path.substring(2)).forward(request, response); //转发,可以带数据给前端页面
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}
    

	写一个抽象的base基类,继承httpServlet类,定义两个静态变量,分别做重定向和转发的根目录,在init函数中,初始化两个静态变量,分别找到项目重定向和转发目录,并在前面加"r:"表示重定向,“f:”表示转发。
      然后重写servlet方法,因为doGet和doPost最终都会到这里,设置编码格式,防止乱码,获的请求的method值,用来判断请求的方法。用类加载器加载当前的类,如果method为null,则终止程序,否则就利用反射获得当前传过来的方法(Get/Post),然后运行该程序,得到返回值,接着通过对请求方法的值判定,决定进入什么方法,是转发,还是重定向,还是ajax操作。
    其他类通过继承这个类可以解决如何使用ajax且保证页面不跳转的问题

2.实现登录

package com.zlt.opteraction;

import java.io.IOException;

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

public class UserServlet extends HttpServlet {

	private static final long serialVersionUID = 551558458052322342L;

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * doPost代表HTTP请求类型
		 * HTTP请求类型分为两种:GET请求,POST请求
		 * POST请求就对应Servlet中doPost方法
		 * POST请求对应HTML页面中表单提交
		 */
		String logname = request.getParameter("logname");
		String logpass = request.getParameter("logpass");
		if ("admin".equals(logname) && "123".equals(logpass)) {
			//用Session来保存一下用户信息
			HttpSession session = request.getSession();
			session.setAttribute("logname", logname);
			
			//页面的跳转
			response.sendRedirect("html/defaul/defaul.html");
		} else {
			//重新的登录
			response.sendRedirect("login.html");
		}
	}

	
}

同样写一个继承了httpServlet的类,然后获取用户信息,如果账户密码正确,就用session保存一下用户信息,方便其他类的使用,然后进行页面跳转。否则返回登录界面重新登录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值