模拟Struts2实现

本文主要是一个模拟的Struts2的简单实现

真正的MVC架构

这里写图片描述

实现主要思路

定义一个过滤器,接收传递过去的Action,根据处理的结果重定向或者转发。

首先定义index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title></title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="${pageContext.request.contextPath}/addCustomer.action" method="post">姓名:<input type="text" name="name"/><br/>年龄:<input type="text" name="age"/><br/><input type="submit" value="保存"/></form></body>
</html>

在web.xml中配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>MyStruct2</display-name><filter><filter-name>CenterFilter</filter-name><filter-class>cn.itcast.framework.core.CenterFilter</filter-class>
<!--        <init-param>-->
<!--            <param-name>aciontPostFix</param-name>-->
<!--            <param-value>action,do</param-value>-->
<!--        </init-param>--></filter><filter-mapping><filter-name>CenterFilter</filter-name><url-pattern>/*</url-pattern></filter-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>

核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 核心配置文件 -->
<framework><!-- action:name:必须有,且唯一。如同之前请求的什么operationclass:必须有,要执行哪个JavaBean的类名method:可以没有。没有的话就是默认值execute。JavaBean中对应的操作方法。该方法的特点是:public String addCustomer(){}--><action name="addCustomer" class="cn.itcast.domain.Customer" method="addCustomer"><!-- result:代表着一种结果。type:可以没有,默认是dispatcher。转向目标的类型。dispatcher代表着请求转发name:必须有。对应的是JavaBean中addCustomer的返回值主体内容:必须有。目标资源的URI--><result type="redirect" name="success">/success.jsp</result><result type="dispatcher" name="error">/error.jsp</result></action><action name="updateCustomer" class="cn.itcast.domain.Customer" method="updateCustomer"><result type="dispatcher" name="success">/success.jsp</result></action>
</framework>

核心过滤器实现

  1. 初始化配置文件,读取XML配置文件:把配置文件中的信息封装到对象中.再放到actions中
  2. 取配置参数,如果你请求的地址以action\do\空结尾的话,才真正过滤。
  3. 解析用户请求的URI,截取后缀名,看看是否需要我们的框架进行处理
  4. 如果需要框架处理,解析uri中的动作名称,获得相应方法处理
  5. 根据结果中的type决定是转发还是重定向,重定向的目标就是结果中的targetUri
package cn.itcast.framework.core;import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;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 org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Document;
import org.dom4j.Element;import cn.itcast.framework.util.Dom4JUtil;public class CenterFilter implements Filter {//存取配置文件信息。key:对应action中的name value:Action对象private Map<String, Action> actions = new HashMap<String, Action>();private FilterConfig filterConfig;public void init(FilterConfig filterConfig) throws ServletException {initCfg();//初始化配置文件this.filterConfig = filterConfig;}//初始化配置文件private void initCfg() {//读取XML配置文件:把配置文件中的信息封装到对象中.再放到actions中Document document = Dom4JUtil.getDocument();Element root = document.getRootElement();//得到所有的action元素,创建Action对象,封装信息List<Element> actionElements = root.elements("action");if(actionElements!=null&&actionElements.size()>0){for(Element actionElement:actionElements){//封装action信息开始Action action = new Action();action.setName(actionElement.attributeValue("name"));action.setClassName(actionElement.attributeValue("class"));String methodXmlAttrValue = actionElement.attributeValue("method");if(methodXmlAttrValue!=null)action.setMethod(methodXmlAttrValue);//封装action信息结束//得到每个action元素中的result元素,创建Result对象,封装信息//封装属于当前action的结果List<Element> resultElements = actionElement.elements("result");if(resultElements!=null&&resultElements.size()>0){for(Element resultElement:resultElements){Result result = new Result();result.setName(resultElement.attributeValue("name"));result.setTargetUri(resultElement.getText().trim());String typeXmlValue = resultElement.attributeValue("type");if(typeXmlValue!=null){result.setType(ResultType.valueOf(typeXmlValue));}action.getResults().add(result);}}//封装属于当前action的结果//把Action对象都放到Map中actions.put(action.getName(), action);}}}public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {try {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;//真正的控制器部分//取一个配置参数String aciontPostFixs [] = {"action","","do"};//你请求的地址以action\do\空结尾的话,才真正过滤。默认值String aciontPostFix = filterConfig.getInitParameter("aciontPostFix");if(aciontPostFix!=null){aciontPostFixs = aciontPostFix.split("\\,");}//解析用户请求的URIString uri = request.getRequestURI();//   /strutsDay01MyFramework/addCustomer.action//截取后缀名,看看是否需要我们的框架进行处理//切后缀名String extendFileName = uri.substring(uri.lastIndexOf(".")+1);// /strutsDay01MyFramework/addCustomer.action   action// /strutsDay01MyFramework/addCustomer.do   do// /strutsDay01MyFramework/addCustomer   ""boolean needProcess = false;for(String s:aciontPostFixs){if(extendFileName.equals(s)){needProcess = true;break;}}if(needProcess){//需要框架处理//解析uri中的动作名称String requestActionName = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));System.out.println("您的请求动作名是:"+requestActionName);//查找actions中对应的Action对象if(actions.containsKey(requestActionName)){Action action = actions.get(requestActionName);//得到类名称的字节码Class clazz = Class.forName(action.getClassName());//封装数据到JavaBean中,利用BeanUtils框架Object bean = clazz.newInstance();BeanUtils.populate(bean, request.getParameterMap());//实例化,调用其中指定的方法名称Method m = clazz.getMethod(action.getMethod(), null);//根据方法的返回值,遍历结果String resultValue = (String)m.invoke(bean, null);List<Result> results = action.getResults();if(results!=null&&results.size()>0){for(Result result:results){if(resultValue.equals(result.getName())){//根据结果中的type决定是转发还是重定向//重定向的目标就是结果中的targetUriif("dispatcher".equals(result.getType().toString())){//转发request.getRequestDispatcher(result.getTargetUri()).forward(request, response);}if("redirect".equals(result.getType().toString())){//重定向response.sendRedirect(request.getContextPath()+result.getTargetUri());}}}}}else{throw new RuntimeException("The action "+requestActionName+" is not founded in your config files!");}}else{chain.doFilter(request, response);}} catch (Exception e) {throw new RuntimeException(e);}}public void destroy() {}}

javabean如下

package cn.itcast.domain;import java.io.Serializable;public class Customer implements Serializable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String addCustomer(){if("wzhting".equals(name)){return "success";}else{return "error";}}
}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战教学--怎样提高报表呈现的性能?

报表的性能很重要&#xff0c;是一个总被谈及的问题&#xff0c;跑的慢的报表用户体验恶劣&#xff0c;无法忍受。解决这些慢的性能问题&#xff0c;也成了项目方和工程师头疼的事情。一出状况&#xff0c;就得安排技术好的&#xff0c;能力强的工程师去救火&#xff0c;本来利…

WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网...

现在人们身边手机、游戏机等各种使用WiFi上网的设备已经越来越多&#xff0c;但经常遇到一些地方只有有线网络&#xff0c;或者没有无线路由器的情况&#xff0c;这时&#xff0c;用笔记本上网&#xff0c;然后把网络通过WiFi共享给其他设备上网那么就最合适了。我们之前有介绍…

干货|李开复最新刷屏演讲:人工智能最难取代这13种工作,也最容易威胁人性与爱!...

来源&#xff1a;澎湃新闻这两年&#xff0c;创新工场董事长兼首席执行官李开复&#xff0c;一直为人工智能站台和奔走&#xff0c;还出新书帮助人们规划未来的AI生活。他预言&#xff0c;中国有望在全球范围内首先实现OMO&#xff08;Online-Merge-Offline&#xff0c;线上线下…

Apifox vs Eolink,国内 Api 工具哪家强?

目前行业内有 postman、jmeter 为代表开源 Api 工具派系&#xff0c;我想对大家对这两个词并不陌生。虽然它们能解决基本的接口测试&#xff0c;但是无法解决接口链路上的所有问题&#xff0c;一个工具难以支持整个过程。 在国内&#xff0c;我们可以看到有国产 API 管理工具&…

人工智能、区块链、混合现实:2019年新闻、媒体与技术趋势

来源&#xff1a;资本实验室近日&#xff0c;未来今日研究所&#xff08;Future Today Institute&#xff09;发布了《2019年新闻、媒体与技术趋势报告》&#xff0c;报告提出了涵盖多个领域的108个新兴技术趋势。报告显示&#xff0c;未来的新闻、媒体等行业将受到各种技术错综…

活久见:都 2203 年了,你还在使用 word 调试 API

随着信息技术的发展&#xff0c;API 变得无处不在&#xff0c;无处不用。但令人费解的是&#xff0c;都 2203 年了&#xff0c;竟然还有很多人使用 word 调试 API&#xff1f; 今天&#xff0c;西红柿将带领大家打开新世界的大门&#xff0c;放下诺基亚&#xff0c;抄起智能机&…

Struts2基础知识

本文主要包括以下内容 struts2常用常量的定义与意义struts2处理流程拆分struts动态方法调用,使用通配符接收请求参数中文编码问题自定义类型转化器访问或添加request/session/application常用servlet对象的获取 struts2常用常量的定义与意义 struts2处理流程 每一次请求都会创…

自动驾驶汽车测试在美惹争议,原因为何?

来源&#xff1a;中国汽车报摘要&#xff1a;近日&#xff0c;针对美国总统特朗普提出的&#xff0c;汽车制造商需自愿提交他们在公共道路上测试自动驾驶汽车安全报告一事&#xff0c;回应者寥寥&#xff0c;目前只有三家汽车公司响应了上述要求&#xff0c;提交了相关材料。据…

Struts2基础知识(二)

本文主要包括以下内容 文件上传&#xff0c;多文件上传 自定义拦截器 用户输入验证国际化 文件上传 将头设置为enctype”multipart/form-data” <body><form action"${pageContext.request.contextPath}/upload/upload1.action" method"post" …

想做自动驾驶技术的入,这回分享一个简单好用的开放平台

前言 自动驾驶已经是现在技术开发领域最热门的方向之一&#xff0c;作为程序员&#xff0c;很多人也都想来这个领域试试水。但是这个领域的门槛也挺高&#xff0c;不过想开始的话&#xff0c;其实可以从一些专门针对自动驾驶的开放平台开始入手&#xff0c;目前比较主流的可以…

潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...

岳排槐 编辑量子位 出品 | 公众号 QbitAI据消息&#xff0c;潘建伟团队日前成功实现了器件无关的量子随机数&#xff0c;将在数值模拟、密码学等领域广泛应用&#xff0c;并有望形成新的随机数国际标准。相关研究成果于北京时间20日由国际权威学术期刊《自然》在线发表&#xf…

一篇文章搞懂数据仓库:数据治理(目的、方法、流程)

目录 1、什么是数据治理 2、数据治理的目的 3、数据治理的方法 4、数据质量8个衡量标准 5、数据治理流程 1、什么是数据治理 数据治理&#xff08;Data Governance&#xff09;是组织中涉及数据使用的一整套管理行为。由企业数据治理部门发起并推行&#xff0c;关于如何制…

在OEL5上安装配置Oracle Gird Control 10.2.0.5

早期的Grid Control问题实在太多了&#xff0c;以至于把10.2.0.1的Grid Control升级到10.2.0.5几乎是不可能完成的任务&#xff1b;此外10.2.0.5以前的gc不支持11g作为repository database仓库数据库&#xff0c;不仅于此10.2.0.1版本是不支持rhel5或OEL5的&#xff0c;如果想安…

Struts2基础知识(三)

本文主要包括以下内容 OGNL表达式标签 防止表单重复提交 使用第三方插件tomcat启动时struts2容器做的事 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写&#xff0c;它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 相对EL表达…

70行Python代码,获取中国数据库大会(DTCC)全部PPT

大家好&#xff0c;我是明月十四桥&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 学会使用python 获取各种网站的ppt&#xff0c;可见即可爬&#xff1b; ② 中国数据库大会一年一届&#xff0c;门票昂贵&#xff0c;干货…

半导体产业格局:行稳而致远,强者将恒强

来源&#xff1a;华泰证券▌中国半导体产业链渐趋完善&#xff0c;产业生态体系逐步成形目前我国垂直分工模式的芯片产业链初步搭建成形&#xff0c;产业上中下游已然打通&#xff0c;涌现出一批实力较强的代表性本土企业。集成电路是基础性、先导性产业&#xff0c;涉及国家信…

Struts2之Crud综合实例

本文是Struts2的综合实例&#xff0c;主要包含以下功能 添加&#xff0c;删除&#xff0c;修改&#xff0c;查询用户上传&#xff0c;下载图片 拦截器实现登陆功能 验证器检查输入 下载图片功能以前没有实现过&#xff0c;步骤如下 在类中增加两个属性 //文件下载private…

教你用python爬英雄联盟官网:①掌握爬虫技术;②Python数据可视化

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 掌握爬虫技术&#xff0c;体会python爬虫流程&#xff0c;可见即可爬&#xff1b; ② 学会使用python数据可视化。 有问题的…

7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)

大家好&#xff0c;我是明月十四桥&#xff01; 你要偷偷努力&#xff0c;然后惊艳所有人~ 给大家推荐 7 个宝藏级教程&#xff0c;视频课是永久有效的&#xff0c;可以随时学习&#xff0c;有几门课程还有CSDN官方学习答疑群&#xff0c;课程右边扫码入群&#xff0c;讲师在群…

权威发布 |《科学美国人》:2018全球十大新兴技术

来源&#xff1a;世界经济论坛摘要&#xff1a;尽管这些技术仍处于发展早期&#xff0c;但它们吸引了众多研究团队的关注&#xff0c;并且广受投资者青睐。在未来3~5年间&#xff0c;它们可能会对社会与经济产生重要影响。9月19日&#xff0c;《科学美国人》与世界经济论坛&…