整儿思路如下
- 将各种重要的信息放到xml中
- 在过滤器中配置好,需要访问的路径
- 读取xml,拿到数据,跳转,这样就实现springmvc的小部分功能
所以需要下面的知识点
- 会定义xml文件的dtd
- 读取xml文件 (dom4j)
- 反射基础
- javaweb基础
- 过滤器
首先我的项目目录如下
所以下面就开始了,我按照步骤来取标题
1. 定义xml的DTD文件
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT hhymvc (action*)>
<!ELEMENT action (result+)>
<!ELEMENT result (#PCDATA)>
<!--配置三个属性-->
<!ATTLIST action name ID #REQUIRED class CDATA #REQUIRED>
<!ATTLIST result name CDATA #REQUIRED>
ELEMENT是标签
ATTLIST是属性。
*
代表有0个或者是多个
+
代表是有一个或者多个
#PCDATA 和 CDATA
是填写文字
ID
是代表唯一不可以重复
#REQUIRED
代表必填
对应的xml如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hhymvc SYSTEM "hhy.dtd">
<hhymvc>
<action name="s1" class="mymvc.servlet.MyServlet01">
<result name="0">0.jsp</result>
<result name="1">1.jsp</result>
</action>
<action name="s2" class="mymvc.servlet.MyServlet02">
<result name="yes">yes.jsp</result>
<result name="no">no.jsp</result>
</action>
</hhymvc>
2. 定义一个接口代替httpservlet
public interface HhyAction{
public String execute(HttpServletRequest request,HttpServletResponse response);
}
接口很简单。
servlet实现接口
public class MyServlet01 implements HhyAction {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
return "0";
}
}
3. 配置过滤器
public class HhyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>myfilter</filter-name>
<filter-class>mymvc.filter.HhyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<context-param>
<param-name>hhymvc</param-name>
<param-value>hhymvc.xml</param-value>
</context-param>
</web-app>
可以看到这个地方我除了过滤器的标签,还有一个context-param标签,
这个标签是,保存一个全局的变量。。。方便待会拿。
public class HhyFilter implements Filter {
private Map<String,String> resultMap = new HashMap<>();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
//截取字符串
String requestURL = new String(req.getRequestURL());
String servletName = requestURL.substring(requestURL.lastIndexOf("/") + 1, requestURL.indexOf("."));
// System.out.println(servletName);
HhyAction action = getAction(req, servletName);
//这里拿到返回值,然后通过map获取参数让后跳转
String executeResult = action.execute(req, resp);
if (resultMap.containsKey(executeResult)){
//这里就跳转
resp.sendRedirect(resultMap.get(executeResult));
}
}
public HhyAction getAction(HttpServletRequest request, String servletName) {
HhyAction hhyAction = null;
String className = "";
//这一步可以拿到web.xml 中存储的xml名字。
String hhymvc = request.getServletContext().getInitParameter("hhymvc");
//这里就是拿到xml的绝对路径
String xmlPath = request.getRealPath("./") + hhymvc;
System.out.println(xmlPath);
//拿到xml的名字之后就是解析xml
try {
SAXReader saxReader = new SAXReader();
Document read = saxReader.read(new File(xmlPath));
Element hhymvcElement = read.getRootElement();
List<Element> actionElements = hhymvcElement.elements();
for (Element actionElement : actionElements) {
if (servletName.equals(actionElement.attributeValue("name"))){
//要在这里获取全类名,待会方便反射
className = actionElement.attributeValue("class");
for (Element resultElement : actionElement.elements()) {
//这里把对应的请求放到了map中。。
resultMap.put(resultElement.attribute(0).getValue(),resultElement.getText());
}
}
}
resultMap.forEach((k,v)->{
System.out.println(k+":"+v);
});
//拿到这个class之后就可以开始反射了
hhyAction = (HhyAction) Class.forName(className).newInstance();
} catch (DocumentException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return hhyAction;
}
}
这里可能有点多,那到底干了什么呢,
- 从web.xml中拿到了xml的文件名
- 拿到这个文件名的绝对路径,然后使用SAXReader对象读取这个xml
- 读取xml中的数据,然后拿出来放到map中。
- 从map中拿到数据(需要跳转的网页),然后跳转