在做java web项目中为了节省开发时间,我们都会用到ssh框架,之前学习了一个struts一小会,学习中学到了模拟struts的简单运行机制,所以在这里分享一下。

前期准备,先下载dom4j.jar:解析xml文件

县创建一个web工程,目录结构如下(包括创建的文件):

第一步创建工程之后,创建一个JavaBean例如:Xml2Bean,源码如下:

package example.domain;public class Xml2Bean {private String actionName;//请求action节点中的name属性private String actionMethod;//action节点中的method属性private String actionClass;//action节点中的class属性private String resultName;//result节点中的name属性private String resultType;//result节点中的type属性private String resultContent;//result节点中的文本内容public Xml2Bean(String actionName, String actionMethod, String actionClass,String resultName, String resultType, String resultContent) {super();this.actionName = actionName;this.actionMethod = actionMethod;this.actionClass = actionClass;this.resultName = resultName;this.resultType = resultType;this.resultContent = resultContent;}public Xml2Bean() {super();// TODO Auto-generated constructor stub}public String getActionName() {return actionName;}public void setActionName(String actionName) {this.actionName = actionName;}public String getActionMethod() {return actionMethod;}public void setActionMethod(String actionMethod) {this.actionMethod = actionMethod;}public String getActionClass() {return actionClass;}public void setActionClass(String actionClass) {this.actionClass = actionClass;}public String getResultName() {return resultName;}public void setResultName(String resultName) {this.resultName = resultName;}public String getResultType() {return resultType;}public void setResultType(String resultType) {this.resultType = resultType;}public String getResultContent() {return resultContent;}public void setResultContent(String resultContent) {this.resultContent = resultContent;}}

第二步:新建一个xml文件,myxml.xml:如下:

<?xml version="1.0" encoding="UTF-8"?>
<package><action name="myaction" class="example.action.Myaction" method="execute"><result name="ok" type="dispatcher">/myjsp.jsp</result></action>
</package>

第三步:创建一个简单的类叫MyAction:

package example.action;public class Myaction {public String execute(){System.out.println("hello word");return "ok";}
}

第四步:写一个工具类解析xml文件(MyUtils),代码如下:

MyUtils:

package example.utils;import java.io.InputStream;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import example.domain.Xml2Bean;public class MyUtils {//使用类加载器加载xml文件,由于只加载一次,所以放在静态代码块中private static InputStream ins;static{ins= MyUtils.class.getClassLoader().getResourceAsStream("MyXml.xml");}public static Xml2Bean ResolveXml(){SAXReader saxReader=new SAXReader();Xml2Bean xml2Bean = null;try {Document document= saxReader.read(ins);//获取xml整个文档Element rootElement= document.getRootElement();//获取根节点Element actionElement= rootElement.element("action");//获取action节点/*******************获取action节点的属性********************************/String actionName= actionElement.attributeValue("name");String actionClass=actionElement.attributeValue("class");String actionMethod=actionElement.attributeValue("method");Element resultElement=actionElement.element("result");/**********************获取result节点的属性*****************************/String resultName=resultElement.attributeValue("name");String resultType=resultElement.attributeValue("type");//获取result节点的文本内容String resultContent=resultElement.getText().trim();//开始封装到xmlBean中xml2Bean=new Xml2Bean(actionName, actionMethod, actionClass, resultName, resultType, resultContent);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return xml2Bean;}
}

第五步:创建一个过滤器叫MyFilter,

package example.filter;import java.io.IOException;
import java.lang.reflect.Method;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import example.domain.Xml2Bean;
import example.utils.MyUtils;public class MyFilter implements Filter {private Xml2Bean xml2Bean;public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest res, ServletResponse resp,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub//获取用户的请求的路径,防止请求路径出错时的情况HttpServletRequest request=(HttpServletRequest) res;HttpServletResponse response=(HttpServletResponse) resp;try{//开始获取用户请求路径的请求名称String path=request.getServletPath();//获取到最后一个反斜杠之后的字符串,如:/***.actionString pathName=path.substring(1, path.indexOf("."));System.out.println(pathName);//这里开始比较xmlbean中的内容和用户请求的相比较if(xml2Bean.getActionName().equals(pathName)){//如果用户请求的路径正确//获取action的节点中的class属性String actionClass=xml2Bean.getActionClass();//获取class属性该类的字节码Class clazz= Class.forName(actionClass);Object obj= clazz.newInstance();String actionMethod=xml2Bean.getActionMethod();//取得该类中对应的方法Method method=clazz.getMethod(actionMethod, null);//执行methodObject resultValue=method.invoke(obj, null);System.out.println("测试返回值是:"+resultValue);//开始获取result节点if(resultValue.equals(xml2Bean.getResultName())){//比较name属性String forpath=xml2Bean.getResultContent();if(xml2Bean.getResultType().equals("dispatcher")){//比较type属性,转发的话执行这里request.getRequestDispatcher(forpath).forward(request, response);}else if(xml2Bean.getResultType().equals("redirect")){response.sendRedirect(request.getContextPath()+forpath);}}}else{//返回404错误response.sendError(HttpServletResponse.SC_NOT_FOUND);}}catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub//开始解析xmlxml2Bean=MyUtils.ResolveXml();}}

第六步:在web.xml注册过滤器,

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><filter><filter-name>MyFilter</filter-name><filter-class>example.filter.MyFilter</filter-class></filter> <filter-mapping><filter-name>MyFilter</filter-name><url-pattern>*.action</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

最后测试:

整个模拟的结果就是,这只是我学习过程中的一个简单的模拟结果。。。。。。。。。。。。。。

简单模拟struts框架,了解strusts的框架实现机制相关推荐

  1. 学习Struts框架系列(一):模拟Struts工作流程

    进入j2ee的学习,听到了不少框架,可谓百家争鸣,框架对基本的操作进行了封装,如果不懂得实现原理,尽管可以配配文件,让网站跑起来,但未免有时一头雾水,不知其因,所以想要明白其理,甚至灵活运用,必须对框 ...

  2. 简单介绍一下Java常用的五大框架!

    Java框架在Java开发中的作用是毋庸置疑的.那么Java常用框架有哪些?大概包括:Hibernate.Spring.Struts.jQuery.Redis五种.这些框架有什么用呢?Java常用框架 ...

  3. Struts 2 Spring Hibernate三大框架的执行流程以及原理

    转:http://www.cnblogs.com/System-out-println/p/5974113.html Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框 ...

  4. 学习C++项目——一个基于C++11简单易用的轻量级网络编程框架 1

    一个基于C++11简单易用的轻量级网络编程框架 一.项目下载.导入.编译和运行   现在准备深入学习 C++ ,先肝一个项目,这个项目是<一个基于C++11简单易用的轻量级网络编程框架>, ...

  5. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点

    在正式开始Web开发前,我们需要编写一个Web框架. 为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架: Django:一站式开发框架,但不利于定制化: web ...

  6. 论文翻译:DeepFaceLab:一个简单,灵活的可扩展换脸框架

    DeepFaceLab:一个简单,灵活的可扩展换脸框架 时间有限,翻译仓促,为个人学习所用,仅供参考. DeepFaceLab: A simple, flexible and extensible f ...

  7. 爬虫系统基础框架 何时使用爬虫框架? requests库 + bs4来实现简单爬虫

    转载请注明出处https://www.cnblogs.com/alexlee666/p/10180519.html,谢谢! 文中图片来自于我的简书博客. 一. 爬虫用途和本质: 网络爬虫顾名思义即模仿 ...

  8. Jmeter简介以及简单模拟性能测试

    1.Jemter简介 1.我们为什么使用Jmeter 开源,免费,基于Java编写,可集成到其他系统可拓展各个功能插件 支持接口测试, 压力(负载和压力)测试等多种功能,支持录制回放, 入门简单相较于 ...

  9. java框架_2020年Java框架排行榜,谁居榜首?

    作者丨Patricia Neil来源丨Java技术驿站https://urlify.cn/ammaYj诞生于1995年的Java,目前已在134,861个网站上广泛使用,包括ESPN.SnapDeal ...

最新文章

  1. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull
  2. oracle 10.2.0.4 rac emca,ORACLE 10G RAC升级10.2.0.4报错
  3. 来讲讲Cortex-M、 ARM、和Linux
  4. tf.clip_by_value
  5. Facebook POP 使用指南
  6. JZOJ 5195. 【NOIP2017提高组模拟7.3】A
  7. OpenCV在水平线上校准3个摄像机的实例(附完整源代码)
  8. 【REPERTOIRE】Rastaman Vibration
  9. SAP HANA Backup and Recovery
  10. 操作系统OS进程(一)初识
  11. java删除数组里的两个_java – 如何从两个数组列表中删除常用值
  12. CONSUL install 和启动
  13. vue computed 传参_前端面试时面试官想要听到什么答案(关于一些Vue的问题)
  14. 阵列信号处理——研究背景与现状
  15. 淘宝购买win10激活码流程
  16. 计算机专业是不是天坑专业,工科中的三大“天坑”专业,就业前景不太乐观,入坑需谨慎!...
  17. 风吹雪支付系统易支付去后台验证版本代理系统
  18. android opengl版本太低,安卓模拟器opengl_安卓模拟器无法安装“系统opengl版本过低”的通用解决方法_安卓模拟器通用版_通用安卓模拟器...
  19. Macbook忘记密码的解决方法
  20. 鸿蒙系统发红包,混沌鸿蒙录红包版

热门文章

  1. PHP+Redis令牌桶算法 接口限流
  2. 【JavaWeb】AJAX
  3. java归并排序算法
  4. 进程和线程的区别 及 进程间通信的方式
  5. 详解,N沟道MOS管和P沟道MOS管
  6. Unity Animator入门:使用Animator和trigger参数做简单的UI动画
  7. markdown中关于空格缩进的问题
  8. vue下拉框值改变事件_下拉框的change事件
  9. 华为杯第一届中国研究生网络安全创新大赛-Bit_QR
  10. unity 实验演示 教程_铁匠常见问题解答和Unity演示团队