对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保存一下用户信息,方便其他类的使用,然后进行页面跳转。否则返回登录界面重新登录。