Struts 2
是一种MVC框架。html
Struts 2
框架中的处理大概分为如下几个步骤:java
客户端初始化一个指向Servlet容器的请求;web
这个请求通过一系列的过滤器(Filter)后,核心控制器FilterDispatcher
根据请求询问ActionMapper
来决定这个请求是否须要调用某个Action。若是ActionMapper
决定须要调用某个Action,FilterDispatcher
把请求的处理交给ActionProxy
。ActionProxy
经过Configuration Manager询问框架的配置文件,找到须要调用的Action类。数据库
ActionProxy
建立一个ActionInvocation
的实例。ActionInvocation
实例使用命令模式调用,回调Action的execute
方法,该方法先获取用户请求参数,而后执行某种数据库操做,既能够是将数据保存到数据库,也能够从数据库中检索信息。由于Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。在调用Action的过程先后,将涉及到相关拦截器的调用。apache
当Action执行完毕后,ActionInvocation
会根据 struts.xml 中的配置找到对应的返回结果并将其输出到浏览器中,能够是HTML页面、图像,也能够是文档。此时支持的视图技术很是多。segmentfault
实现一个Struts 2
应用,只须要配置 struts.xml 文件,编写Action代码和相关视图资源文件。浏览器
struts 2
配置文件:配置文件是用户视图(View)和业务逻辑模块(Model)Action之间的桥梁。app
struts.xml
文件,Struts 2
全局属性的 struts.properties
文件配置好开发环境,安装好Struts(将所须要的jar包放入相应位置)。框架
<?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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>struts 2.0 应用项目</display-name> <filter> <filter-name>struts2</filter-name> <!-- filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class--> <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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
package com.struts2.app; public class UserLoginAction { //下面是Action用于封装用户请求参数的两个属性 private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String password) { this.pass = password; } //处理用户请求的execute方法 public String execute() throws Exception { if("admin".equals(getName()) && "12345".equals(getPass())) { return "success"; } else if(getName()==null || getPass()==null) { return "input"; } else return "error"; } }
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!--include file="struts-default.xml" /--> <!-- Struts 2 的Action必须放在指定的包空间下定义 --> <package name="struts" extends="struts-default"> <action name="UserLogin" class="com.struts2.app.UserLoginAction"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>
<%@page language="java" import="java.util.*" pageEncoding="GBK" %> <html> <head> <title>Struts 2 Demo</title> </head> <body> <form action="UserLogin.action" method="post"> <table align="center"> <caption><h4>用户登陆信息</h4></caption> <tr> <td>用户名:<input type="text" name="name" /></td> </tr> <tr> <td>密 码:<input type="password" name="pass" /></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登 录" /><input type="reset" value="清 除" /></td> </tr> </table> </form> </body> </html>
<%@page language="java" import="java.util.*" pageEncoding="GBK" %> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>登陆成功页面</title> </head> <body> 您已成功登陆本系统! <li><a href="<s:url action="UserLogin" />">从新登陆</a></li> <br> </body> </html>
<%@page language="java" import="java.util.*" pageEncoding="GBK" %> <%@taglib prefix="s" uri="/struts-tags"%> <% String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName()+ ":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>"> </head> <body> 您输入的用户名或密码错误,请从新输入 <br><li><a href="<s:url action="UserLogin" />">Sign on</a></li> </body> </html>
login.jsp
(页面内跳转地址,struts拦截) ===> struts.xml
(指定并调用Action类,以及不一样结果下返回的视图界面)===>UserLoginAction.java
(execute方法,返回值)===>struts.xml
(得到返回值,调用视图)jsp
能够看出,整个过程和servlet十分类似。只不过servlet使用web.xml
映射java文件和路径,这里是用struts.xml
(固然前提是在web.xml中有struts配置)。另外,servlet是直接用java文件返回其视图的;而这里经过三个jsp视图文件处理不一样状况下的视图。这样,即将视图层与控制层分开。