日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟Struts2实现

發(fā)布時(shí)間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟Struts2实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要是一個(gè)模擬的Struts2的簡(jiǎn)單實(shí)現(xiàn)

真正的MVC架構(gòu)

實(shí)現(xiàn)主要思路

定義一個(gè)過濾器,接收傳遞過去的Action,根據(jù)處理的結(jié)果重定向或者轉(zhuǎn)發(fā)。

首先定義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:必須有,且唯一。如同之前請(qǐng)求的什么operationclass:必須有,要執(zhí)行哪個(gè)JavaBean的類名method:可以沒有。沒有的話就是默認(rèn)值execute。JavaBean中對(duì)應(yīng)的操作方法。該方法的特點(diǎn)是:public String addCustomer(){}--><action name="addCustomer" class="cn.itcast.domain.Customer" method="addCustomer"><!-- result:代表著一種結(jié)果。type:可以沒有,默認(rèn)是dispatcher。轉(zhuǎn)向目標(biāo)的類型。dispatcher代表著請(qǐng)求轉(zhuǎn)發(fā)name:必須有。對(duì)應(yīng)的是JavaBean中addCustomer的返回值主體內(nèi)容:必須有。目標(biāo)資源的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>

核心過濾器實(shí)現(xiàn)

  • 初始化配置文件,讀取XML配置文件:把配置文件中的信息封裝到對(duì)象中.再放到actions中
  • 取配置參數(shù),如果你請(qǐng)求的地址以action\do\空結(jié)尾的話,才真正過濾。
  • 解析用戶請(qǐng)求的URI,截取后綴名,看看是否需要我們的框架進(jìn)行處理
  • 如果需要框架處理,解析uri中的動(dòng)作名稱,獲得相應(yīng)方法處理
  • 根據(jù)結(jié)果中的type決定是轉(zhuǎn)發(fā)還是重定向,重定向的目標(biāo)就是結(jié)果中的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:對(duì)應(yīng)action中的name value:Action對(duì)象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配置文件:把配置文件中的信息封裝到對(duì)象中.再放到actions中Document document = Dom4JUtil.getDocument();Element root = document.getRootElement();//得到所有的action元素,創(chuàng)建Action對(duì)象,封裝信息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信息結(jié)束//得到每個(gè)action元素中的result元素,創(chuàng)建Result對(duì)象,封裝信息//封裝屬于當(dāng)前action的結(jié)果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);}}//封裝屬于當(dāng)前action的結(jié)果//把Action對(duì)象都放到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;//真正的控制器部分//取一個(gè)配置參數(shù)String aciontPostFixs [] = {"action","","do"};//你請(qǐng)求的地址以action\do\空結(jié)尾的話,才真正過濾。默認(rèn)值String aciontPostFix = filterConfig.getInitParameter("aciontPostFix");if(aciontPostFix!=null){aciontPostFixs = aciontPostFix.split("\\,");}//解析用戶請(qǐng)求的URIString uri = request.getRequestURI();// /strutsDay01MyFramework/addCustomer.action//截取后綴名,看看是否需要我們的框架進(jìn)行處理//切后綴名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中的動(dòng)作名稱String requestActionName = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));System.out.println("您的請(qǐng)求動(dòng)作名是:"+requestActionName);//查找actions中對(duì)應(yīng)的Action對(duì)象if(actions.containsKey(requestActionName)){Action action = actions.get(requestActionName);//得到類名稱的字節(jié)碼Class clazz = Class.forName(action.getClassName());//封裝數(shù)據(jù)到JavaBean中,利用BeanUtils框架Object bean = clazz.newInstance();BeanUtils.populate(bean, request.getParameterMap());//實(shí)例化,調(diào)用其中指定的方法名稱Method m = clazz.getMethod(action.getMethod(), null);//根據(jù)方法的返回值,遍歷結(jié)果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())){//根據(jù)結(jié)果中的type決定是轉(zhuǎn)發(fā)還是重定向//重定向的目標(biāo)就是結(jié)果中的targetUriif("dispatcher".equals(result.getType().toString())){//轉(zhuǎn)發(fā)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";}} }

    完成

    總結(jié)

    以上是生活随笔為你收集整理的模拟Struts2实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。