(配置目的: 請求, Servlet處理類)
package com.xp.entity;public class User { PRivate String name; private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }}package com.xp.dao;import com.xp.entity.User;/** * 用戶登陸、注冊 */public class UserDao { // 模擬登陸 public User login(User user){ if ("tom".equals(user.getName()) && "888".equals(user.getPwd()) ){ // 登陸成功 return user; } // 登陸失敗 return null; } // 模擬注冊 public void register(User user) { System.out.println("注冊成功:用戶," + user.getName()); }}package com.xp.service;import com.xp.dao.UserDao;import com.xp.entity.User;public class UserService { private UserDao ud = new UserDao(); // 模擬登陸 public User login(User user){ return ud.login(user); } // 模擬注冊 public void register(User user) { ud.register(user); }}package com.xp.framework.action;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.entity.User;import com.xp.service.UserService;/** * Action表示動作類 1. 一個servlet對應一個action 2. action中負責處理具體的請求* */public class LoginAction { public Object execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { return null; } /** * 處理登陸請求 */ public Object login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object uri = null; // 1. 獲取請求數據,封裝 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); User user = new User(); user.setName(name); user.setPwd(pwd); // 2. 調用Service UserService userService = new UserService(); User userInfo = userService.login(user); // 3. 跳轉 if (userInfo == null) { // 登陸失敗// request.getRequestDispatcher("/login.jsp").forward(request,// response);// uri = request.getRequestDispatcher("/login.jsp"); uri = "loginFaild"; // loginFaild = /login.jsp } else { // 登陸成功 request.getsession().setAttribute("userInfo", userInfo); // 首頁// response.sendRedirect(request.getContextPath() + "/index.jsp");// uri = "/index.jsp"; uri = "loginSuccess"; // loginSuccess = /index.jsp } return uri; }}package com.xp.framework.action;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.entity.User;import com.xp.service.UserService;public class RegisterAction { public Object register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object uri; // 1. 獲取請求數據,封裝 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); User user = new User(); user.setName(name); user.setPwd(pwd); // 2. 調用Service UserService userService = new UserService(); userService.register(user); // 3. 跳轉// request.getRequestDispatcher("/login.jsp").forward(request, response); //uri = request.getRequestDispatcher("/login.jsp"); return "registerSuccess"; //返回注冊的標記; registerSuccess = /login.jsp }}package com.xp.framework.bean;public class Result { // 跳轉的結果標記 private String name; // 跳轉類型,默認為轉發; "redirect"為重定向 private String type; // 跳轉的頁面 private String page; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } }package com.xp.framework.bean;import java.util.Map;/** * 封裝action節點 * <action name="login" class="com.xp.framework.action.LoginAction" method="login"> <result name="success" type="redirect">/index.jsp</result> <result name="loginFaild">/login.jsp</result> </action> * */public class ActionMapping { // 請求路徑名稱 private String name; // 處理aciton類的全名 private String className; // 處理方法 private String method; // 結果視圖集合 private Map<String,Result> results; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Map<String, Result> getResults() { return results; } public void setResults(Map<String, Result> results) { this.results = results; } }package com.xp.framework.bean;import java.io.InputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 加載配置文件, 封裝所有的真個mystruts.xml * */public class ActionMappingManager { // 保存action的集合 private Map<String,ActionMapping> allActions ; public ActionMappingManager(){ allActions = new HashMap<String,ActionMapping>(); // 初始化 this.init(); } /** * 根據請求路徑名稱,返回Action的映射對象 * @param actionName 當前請求路徑 * @return 返回配置文件中代表action節點的AcitonMapping對象 */ public ActionMapping getActionMapping(String actionName) { if (actionName == null) { throw new RuntimeException("傳入參數有誤,請查看struts.xml配置的路徑。"); } ActionMapping actionMapping = allActions.get(actionName); if (actionMapping == null) { throw new RuntimeException("路徑在struts.xml中找不到,請檢查"); } return actionMapping; } // 初始化allActions集合 private void init() { /********DOM4J讀取配置文件***********/ try { // 1. 得到解析器 SAXReader reader = new SAXReader(); // 得到src/mystruts.xml 文件流 InputStream inStream = this.getClass().getResourceAsStream("/mystruts.xml"); // 2. 加載文件 Document doc = reader.read(inStream); // 3. 獲取根 Element root = doc.getRootElement(); // 4. 得到package節點 Element ele_package = root.element("package"); // 5. 得到package節點下, 所有的action子節點 List<Element> listAction = ele_package.elements("action"); // 6.遍歷 ,封裝 for (Element ele_action : listAction) { // 6.1 封裝一個ActionMapping對象 ActionMapping actionMapping = new ActionMapping(); actionMapping.setName(ele_action.attributeValue("name")); actionMapping.setClassName(ele_action.attributeValue("class")); actionMapping.setMethod(ele_action.attributeValue("method")); // 6.2 封裝當前aciton節點下所有的結果視圖 Map<String,Result> results = new HashMap<String, Result>(); // 得到當前action節點下所有的result子節點 Iterator<Element> it = ele_action.elementIterator("result"); while (it.hasNext()) { // 當前迭代的每一個元素都是 <result...> Element ele_result = it.next(); // 封裝對象 Result res = new Result(); res.setName(ele_result.attributeValue("name")); res.setType(ele_result.attributeValue("type")); res.setPage(ele_result.getTextTrim()); // 添加到集合 results.put(res.getName(), res); } // 設置到actionMapping中 actionMapping.setResults(results); // 6.x actionMapping添加到map集合 allActions.put(actionMapping.getName(), actionMapping); } } catch (Exception e) { throw new RuntimeException("啟動時候初始化錯誤",e); } }}package com.xp.framework;import java.io.IOException;import java.lang.reflect.Method;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.framework.bean.ActionMapping;import com.xp.framework.bean.ActionMappingManager;import com.xp.framework.bean.Result;/** * 核心控制器,此項目只有這一個servlet * 1. 攔截所有的*.action為后綴的請求 * 2. 請求:http://localhost:8080/mystruts/login.action * http://localhost:8080/mystruts/register.action */public class ActionServlet extends HttpServlet{ private ActionMappingManager actionMappingManager; // 只執行一次 (希望啟動時候執行) @Override public void init() throws ServletException { System.out.println("1111111111111111ActionServlet.init()"); actionMappingManager = new ActionMappingManager(); } // http://localhost:8080/mystruts/login.action @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 1. 獲取請求uri, 得到請求路徑名稱 【login】 String uri = request.getRequestURI(); // 得到 login String actionName=uri.substring(uri.lastIndexOf("/")+1, uri.indexOf(".action")); // 2. 根據路徑名稱,讀取配置文件,得到類的全名 【cn..action.LoginAction】 ActionMapping actionMapping = actionMappingManager.getActionMapping(actionName); String className = actionMapping.getClassName(); // 當前請求的處理方法 【method="login"】 String method = actionMapping.getMethod(); // 3. 反射: 創建對象,調用方法; 獲取方法返回的標記 Class<?> clazz = Class.forName(className); Object obj = clazz.newInstance(); //LoginAction loginAction = new LoginAction(); Method m = clazz.getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class ); // 調用方法返回的標記 String returnFlag = (String) m.invoke(obj, request, response); // 4. 拿到標記,讀取配置文件得到標記對應的頁面 、 跳轉類型 Result result = actionMapping.getResults().get(returnFlag); // 類型 String type = result.getType(); // 頁面 String page = result.getPage(); // 跳轉 if ("redirect".equals(type)) { response.sendRedirect(request.getContextPath() + page); } else { request.getRequestDispatcher(page).forward(request, response); } } catch (Exception e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}package com.xp.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.framework.action.LoginAction;// 控制器public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 創建Action對象,調用登陸方法 LoginAction loginAction = new LoginAction(); Object uri = loginAction.login(request, response); // 跳轉 if (uri instanceof String) { response.sendRedirect(request.getContextPath() + uri.toString()); } else { ((RequestDispatcher) uri).forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}package com.xp.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.framework.action.RegisterAction;public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RegisterAction registerAction = new RegisterAction(); Object uri = registerAction.register(request, response); // 配置文件---》jsp // 跳轉 if (uri instanceof String) { response.sendRedirect(request.getContextPath() + uri.toString()); } else { ((RequestDispatcher)uri).forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}<?xml version="1.0" encoding="UTF-8"?><mystruts> <package> <!-- 配置請求路徑,與處理action類的關系 --> <!-- 1. 請求路徑與處理Action的關系 /login = LoginAction login success = /index.jsp 登陸成功(重定向) loginFaild = /login.jsp 登陸失敗 --> <action name="login" class="com.xp.framework.action.LoginAction" method="login"> <result name="loginSuccess" type="redirect">/index.jsp</result> <result name="loginFaild">/login.jsp</result> </action> <action name="register" class="com.xp.framework.action.RegisterAction" method="register"> <result name="registerSuccess">/login</result> </action> </package></mystruts><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>index</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keyWords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/CSS" href="styles.css"> --> </head> <body> 歡迎你,${sessionScope.userInfo.name } </body></html><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${pageContext.request.contextPath }/login.action" name="frmLogin" method="post"> 用戶名: <input type="text" name="name"> <br/> 密碼: <input type="text" name="pwd"> <br/> <input type="submit" value="登陸"> <br/> </form> </body></html><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${pageContext.request.contextPath }/register.action" name="frmRegister" method="post"> 用戶名: <input type="text" name="name"> <br/> 密碼: <input type="text" name="pwd"> <br/> <input type="submit" value="注冊"> <br/> </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://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" id="WebApp_ID" version="3.1"> <display-name>mystruts</display-name> <!-- 核心控制器 --> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>com.xp.framework.ActionServlet</servlet-class> <!-- 啟動時候執行servlet初始化方法 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>2.struts第一個案例基于mvc模式的應用框架之strutsStruts就是基于mvc模式的框架!(struts其實也是servlet封裝,提高開發效率!)Struts開發步驟:1. web項目,引入struts - jar包
2. web.xml中,引入struts的核心功能配置過濾器
<?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" id="WebApp_ID" version="3.1"> <display-name>struts20150313</display-name> <!-- 引入struts核心過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>3. 開發actionpackage com.xp.action;import com.opensymphony.xwork2.ActionSupport;//開發action: 處理請求public class HelloAction extends ActionSupport{ // 處理請求 public String execute() throws Exception { System.out.println("訪問到了action,正在處理請求"); System.out.println("調用service"); return "success"; }}4. 配置action src/struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts SYSTEM "http://struts.apache.org/dtds/struts-2.0.dtd" PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"><struts> <package extends="struts-default" name="xxxx"> <action name="hello" method="execute" class="com.xp.action.HelloAction"> <result name="success">/success.jsp</result> </action> </package></struts>3.struts詳解
SSH框架在mvc模式的的位置作用:

框架:軟件中的框架,是一種半成品; 我們項目開發需要在框架的基礎上進行!因為框架已經實現了一些功能,這樣就可以提高開發效率!b. Struts2框架Struts1最早的一種基于mvc模式的框架;Struts2 是在Struts1的基礎上,融合了xwork的功能;也可以說,Struts2 = struts1 + xworkStruts2框架預先實現了一些功能:1. 請求數據自動封裝2. 文件上傳的功能3. 對國際化功能的簡化4. 數據效驗功能4.Struts2開發流程 引入jar文件commons-fileupload-1.2.2.jar 【文件上傳相關包】commons-io-2.0.1.jarstruts2-core-2.3.4.1.jar 【struts2核心功能包】xwork-core-2.3.4.1.jar 【Xwork核心包】ognl-3.0.5.jar 【Ognl表達式功能支持表】commons-lang3-3.1.jar 【struts對java.lang包的擴展】freemarker-2.3.19.jar 【struts的標簽模板庫jar文件】javassist-3.11.0.GA.jar 【struts對字節碼的處理相關jar】 配置web.xmlTomcat啟動- 加載自身web.xml---加載所有項目的web.xml通過在項目的web.xml中引入過濾器,-Struts的核心功能的初始化,通過過濾器完成 filter 【init/ 啟動執行doFilter/ 訪問執行destroy】
<!-- 引入struts核心過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>struts2-core-2.3.4.1.jarStrutsPrepareAndExecuteFilter 即為核心過濾器注意:使用的struts的版本不同,核心過濾器類是不一樣的! 開發Action注意:1. action類,也叫做動作類; 一般繼承ActionSupport類 即處理請求的類 (struts中的action類取代之前的servlet)2. action中的業務方法,處理具體的請求- 必須返回String 方法不能有參數public class HelloAction extends ActionSupport { // 處理請求 public String execute() throws Exception {}}配置struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts SYSTEM "http://struts.apache.org/dtds/struts-2.0.dtd" PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"><struts> <package extends="struts-default" name="xxxx"> <action name="hello" method="execute" class="com.xp.action.HelloAction"> <result name="success">/success.jsp</result> </action> </package></struts>5.Struts2執行流程
c.Struts2執行流程
服務器啟動:
1.加載項目web.xml
2.創建Struts核心過濾器對象,執行filter init()
struts-default.xml, 核心功能的初始化
struts-plugin.xml, struts相關插件
struts.xml 用戶編寫的配置文件
訪問:
3.用戶訪問Action, 服務器根據訪問路徑名稱,找對應的aciton配置, 創建action對象
4.執行默認攔截器棧中定義的18個攔截器
5.執行action的業務處理方法
6.struts-default.xml,詳解
目錄:struts2-core-2.3.4.1.jar/ struts-default.xml
內容:
1.bean節點指定struts在運行的時候創建的對象類型
2.指定struts-default包 【用戶寫的package(struts.xml)一樣要繼承此包】
package struts-default 包中定義了:
a. 跳轉的結果類型
dispatcher 轉發,不指定默認為轉發
redirect 重定向
redirectAction 重定向到action資源
stream (文件下載的時候用)
b.定義了所有的攔截器
定義了32個攔截器!
為了攔截器引用方便,可以通過定義棧的方式引用攔截器,
此時如果引用了棧,棧中的攔截器都會被引用!
defaultStack
默認的棧,其中定義默認要執行的18個攔截器!
c.默認執行的攔截器棧、默認執行的action
<default-interceptor-ref name="defaultStack"/> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" /><interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/><interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>攔截器(先睹為快):
攔截器功能與過濾器功能類似。
區別:
共同點:都攔截資源!
區別:
過濾器,攔截器所有資源都可以; (/index.jsp/servlet/img/css/js)
攔截器,只攔截action請求。
攔截器是struts的概念,只能在struts中用。
過濾器是servlet的概念,可以在struts項目、servlet項目用。
//面試題: 攔截器什么時候執行?(訪問/啟動) 先執行action類創建,先執行攔截器?
// --》 1. 用戶訪問時候按順序執行18個攔截器;
//---》 2. 先執行Action類的創建,再執行攔截器; 最后攔截器執行完,再執行業務方法
package com.xp.b_action;public class User { private String userName; private String pwd; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }}package com.xp.b_action;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{ // 面試題: 攔截器什么時候執行? (訪問/啟動) 先執行action類創建,先執行攔截器? // --》 1. 用戶訪問時候按順序執行18個攔截器; //---》 2. 先執行Action類的創建,再執行攔截器; 最后攔截器執行完,再執行業務方法 public UserAction() { System.out.println("UserAction.enclosing_method()"); } /** * private String userName; private String pwd; public void setUserName(String userName) { this.userName = userName; } public void setPwd(String pwd) { this.pwd = pwd; } */ private User user = new User(); public void setUser(User user) { this.user = user; } public User getUser() { return user; } public String login() { // 獲取用戶名密碼 System.out.println(user.getUserName()); System.out.println(user.getPwd()); // 把數據保存到域 ActionContext ac = ActionContext.getContext(); // 得到代表request的map Map<String, Object> request = ac.getContextMap(); // 得到代表session的map Map<String, Object> session = ac.getSession(); // 得到代表servletContext的map Map<String, Object> application = ac.getApplication(); // 保存 request.put("request_data", "request_data"); session.put("session_data", "session_data"); application.put("application_data", "application_data"); return "login"; }}<action name="login" class="com.xp.b_action.UserAction" method="login"> <result name="login">/index.jsp</result></action>d.共性問題問題1:Struts.xml配置文件沒有提示解決a:找到struts-2.0.dtd文件, 拷貝到某個目錄:d:/dtd /.. (不要用中文目錄)讓MyEclipse關聯到上面dtd文件, windows preferences - 搜索xml catalog配置:Location: 上面配置的dtd目錄Key: -//Apache Software Foundation//DTD Struts Configuration 2.0//EN解決b:或者,讓機器連接互聯網,工具會自動下載dtd文件,緩存到MyEclipse中!7.配置詳解<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <!-- package 定義一個包。 包作用,管理action。 (通常,一個業務模板用一個包) name 包的名字; 包名不能重復; extends 當前包繼承自哪個包 在struts中,包一定要繼承struts-default struts-default在struts-default.xml中定的包 abstract 表示當前包為抽象包; 抽象包中不能有action的定義,否則運行時期報錯 abstract=true 只有當當前的包被其他包繼承時候才用! 如: <package name="basePackage" extends="struts-default" abstract="true"></package> <package name="user" extends="basePackage"> namespace 名稱空間,默認為"/" 作為路徑的一部分 訪問路徑= http://localhost:8080/項目/名稱空間/ActionName action 配置請求路徑與Action類的映射關系 name 請求路徑名稱 class 請求處理的aciton類的全名 method 請求處理方法 result name action處理方法返回值 type 跳轉的結果類型 標簽體中指定跳轉的頁面 --> <package name="user" extends="struts-default" namespace="/"> <action name="login" class="cn.itcast.b_execute.UserAction" method="login"> <result name="login">/index.jsp</result> </action> </package> </struts>或者引入其他配置文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <!-- struts在運行時候會加載這個總配置文件: src/struts.xml --> <!-- 總配置文件中引入其他所有的配置文件 --> <include file="com/xp/a_action/hello.xml"></include> <include file="com/xp/b_execute/config.xml"></include></struts>
新聞熱點
疑難解答