Struts框架的原理:
- 客户端初始化一个指向Servlet容器(例如tomcat)的请求,这个请求经过一系列的过滤器(Filter),接着FilterDispatcher(过滤处理器)被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action。其中ActionMapper在web应用启动时根据配置信息加载生成。
- 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类,ActionProxy创建一个ActionInvocation的实例。ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
- 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但也不总是,也可能是另外的一个Action链)一个需要被表示的JSP。在表示的过程中可以使用Struts2 框架中的标签。
可能有点抽象,在后面的程序中会逐步加深!
实例:用户登录
目录展示:
步骤:
1.导入jar包
2.配置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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts_test</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</url-class>
</filter>
<filter-mapping>
<filter-name>struts2</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>
<!-- 文件中配置了FilterDispatcher filter的name和clas属性指出了过滤器的名称和对应的类,<filter-mapping>中的<url-pattern>指出过滤匹配的URL模式,设为/*表示均匹配-->
</web-app>
3.编写jsp文件
(1)login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录系统</title>
</head>
<body>
<br><br><br><br>
<div align="center">
${requestScope.message}
<s:form action="Login" method="POST">
<s:textfield name="adminUserName" lable="用户名"></s:textfield>
<s:password name="adminUserPassword" size="21" lable="密码"/>
<s:submit value="提 交"/>
</s:form>
</div>
</body>
</html>
<!-- ${requestScope.message}是一个EL表达式,这里的mseeage是指在LoginAction中用户登录的校验的报错信息,
在Action中将message设为一个属性,登录校验后,设置message属性的值,系统会将message属性的值保存在request范围中.
转化为jsp后,form表单的action属性为/ch13/Login.action-->
(2)loginResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>验证通过</title>
</head>
<body>
${message}
</body>
</html>
4.配置struts.xml
将struts.xml放置于”WEB-INF/classes”目录下,在eclipse开发时,只需要在”Java Resourse:src“中创建struts.xml文件,则会在动在刚才提到的目录中生成。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="example" extends="struts-default" namespace="">
<action name="Login" class="action.LoginAction">
<result>/loginResult.jsp</result>
<result name="xxx">/login.jsp</result>
</action>
</package>
</struts>
<!--<struts>之间的是actionMapper相关的配置。使用<package>进行分类,<result>指出Action执行完毕后要导向的目标页面。<result>的name表示Action的axecute()方法返回到而相应字符串。如果没有指出name属性值,则默认为"success"。-->
5.编写Action
package action;
import com.opensymphony.xwork2.ActionSupport;
/**
* 用户登录功能的Action类
* @author 13983
*
*/
public class LoginAction extends ActionSupport{
/**
* 执行用户验证的方法
*/
public String message;//execute()执行完后返回的信息
public String adminUserName;
public String adminUserPassword;
public String execute() throws Exception{
if("admin".equals(adminUserName)&&"pass".equals(adminUserPassword))
{
message=adminUserName+"登陆成功!";
}
else{
message=adminUserName+"登陆失败!";
return INPUT;
}
return SUCCESS;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getAdminUserName() {
return adminUserName;
}
public void setAdminUserName(String adminUserName) {
this.adminUserName = adminUserName;
}
public String getAdminUserPassword() {
return adminUserPassword;
}
public void setAdminUserPassword(String adminUserPassword) {
this.adminUserPassword = adminUserPassword;
}
}
可以运行:
本项目使用的jar包:struts 2.0.11