一,servlet基类,BaseController类继承HttpServlet,实现了doGET和doPost方法,相当于springmvc的dispacterservlet,我们只需要在web.xml注册一个BaseController即可。
BaseController.ava
package com.easygo.controller;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseController extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
//调用properties 配置文件
private Properties properties=new Properties();
//字符编码集合
private String charset="utf-8";
@Override
public void init(ServletConfig config) throws ServletException {
//获取初始化的 参数 key value
String configname=config.getInitParameter("configname");
try {
//自动加载配置文件
properties.load(this.getClass().getClassLoader().getResourceAsStream(configname));
//通过配置文件获取到字符编码集
String tmp= properties.getProperty("charset");
if(tmp!=null){
charset=tmp;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取失败!");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//设置字符编码集
req.setCharacterEncoding(charset);
resp.setCharacterEncoding(charset);
//获取到 uri
String act= req.getRequestURI();
// System.out.println(act);
// /MVCController/ user .do
// user --- 找到Config文件的com.uplooking.action.UserAction
act=act.substring(act.lastIndexOf("/")+1,act.lastIndexOf(".do"));
// 获取类路径 System.out.println(act);
String classPath= properties.getProperty(act);
// System.out.println(classPath);
if(classPath==null||classPath.equals("")){
resp.setContentType("text/html");
resp.getWriter().println("没有您要访问的路径!");
return;
}
//进行反射调用
Class iActionClass =Class.forName(classPath);
//反向实例
IAction iAction=(IAction) iActionClass.newInstance();
//交给 子方法进行处理 处理完之后 只要 返回 String request response
//封装返回值
String result= iAction.execute(req, resp);
System.out.println("返回值="+result);
//有返回值的时候
if(result!=null&&!"".equals(result)){
/* 1 默认转发 return "index.jsp";
2 重定向 return "@red_index.jsp"
3json return "@json_{XXXXXX}"*/
if(result.contains("@red_")){
//重定向
resp.sendRedirect(result.split("_")[1]);
}else if(result.contains("@json_")){
resp.setContentType("text/html");
resp.getWriter().println(result.split("_")[1]);
resp.getWriter().close();
}else{
req.getRequestDispatcher(result).forward(req, resp);
}
}else{
//没有返回值的时候
resp.setContentType("text/html");
resp.getWriter().println("没有返回值!");
return;
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
---------------------------------------------------------------------------------------------------------------------------------
web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" >
<display-name>MVCController</display-name>
<servlet>
<servlet-name>BaseController</servlet-name>
<servlet-class>com.easygo.controller.BaseController</servlet-class>
<init-param>
<param-name>configname</param-name>
<param-value>ActionConfig.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>BaseController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
---------------------------------------------------------------------------------------------------------------------------------
IAction接口,Action类实现IAction接口
package com.easygo.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.easygo.controller.IAction;
public class BookAction implements IAction{
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("BookAction");
return "@red_index.jsp";
}
}
---------------------------------------------------------------------------------------------------------------------------------
ActionConfig.properties,key代表URL请求的名称,以.do为后缀,value是改类的全类名,用于反射。
charset=utf-8
#user.do
user=com.easygo.action.UserAction
#book.do
book=com.easygo.action.BookAction
json=com.easygo.action.JsonAction
---------------------------------------------------------------------------------------------------------------------------------
UserAction.java类,原理与springMVC的RequestMapping注解下的方法一样,用于数据返回和页面跳转。
package com.easygo.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.easygo.controller.IAction;
public class UserAction implements IAction {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("UserAction");
return "index.jsp";
}
/*
* BaseController.java 把 HttpServletRequest req, HttpServletResponse resp
* 通过反射 交给指定的类的 方法去处理
*
* |
* |
*
* 处理逻辑方法
*
* 处理完之后 转发
* 重定向
* json
*
* String X指向 _ 访问的页面/数据
* |
* |
* |
* 这个String --BaseController
*
* @Override
public String execute(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
return null;
}
*/
}
---------------------------------------------------------------------------------------------------------------------------------
JsonAction.java用于json数据的返回。
package com.easygo.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.easygo.controller.IAction;
public class JsonAction implements IAction{
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("JsonAction");
return "@json_{asdsadsadsadsadad}";
}
}
---------------------------------------------------------------------------------------------------------------------------------
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
index.jsp
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------
indexX.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="user.do">user.do</a>
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------
测试:
运行indexX.jsp(tomcat8.0)
点击:user.do直接跳转到index.jsp
URL:http://localhost:8088/MVCController/user.do
具体代码:链接: https://pan.baidu.com/s/1spMCZ0hAn_FLAZb1OG5-Pw 密码: 77zi