工作流程:
1.客户端提交一个HttpServletRequest请求(action或JSP页面)。
2.请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等。
3.FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器。
4.请求被发送到FilterDispatcher后,FilterDispatcher询问ActionMapper时候需要调用某个action来处理这个Request。
5.如果ActionMapper决定需要调用某个action,FilterDispatcher则把请求交给ActionProxy进行处理。
6.ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到调用的action类。
7.ActionProxy创建一个ActionInvocation实例,通过代理模式调用Action。
8.action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Intercepter拦截器。
9.最后ActionInvocation实例,负责根据struts.xml中配置result元素,找到与之相对应的result,决定进一步输出。
基本简要流程:
1、客户端向Servlet容器(例如Tomcat)发送请求
2、这个请求经过一系列的过滤器(Filter)
3、接着FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。(此处采用了AOP,一系列的拦截器即通知,Action的方法为切入点)
8、Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
struts2项目配置流程
1.新建web static project
如果没有tomcat的类库,需要添加。
2.将struts2的jar文件复制到WebContent/WEB-INF/lib目录中
3.配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
- <display-name>SSH2</display-name>
- <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>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
① 完全匹配
<url-pattern>/test/list.do</url-pattern>
② 路径匹配
<url-pattern>/*</url-pattern> struts2匹配根路径下的全部请求
③ 扩展名匹配
<url-pattern>*.do</url-pattern> struts1
<url-pattern>*.html</url-pattern> 匹配全部html结尾的请求
<url-pattern>*</url-pattern> 不能用*,否则报错
4.新建login.jsp,error.jsp,welcome.jsp文件
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>
- <title>用户登录</title>
- </head>
- <body>
- <s:form action="login">
- <s:textfield name="username" key="user"></s:textfield>
- <s:textfield name="password" key="pwd"></s:textfield>
- <s:submit key="login"/>
- </s:form>
- </body>
- </html>
welcome.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>
- <title>用户登录</title>
- </head>
- <body>
- 登录成功
- </body>
- </html>
error.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>
- <title>用户登录</title>
- </head>
- <body>
- 登录失败
- </body>
- </html>
5.src目录下新建struts.xml、message.properties文件
struts.xml
- <?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>
- <constant name="struts.enable.DynamicMethodInvocation" value="true" />
- <constant name="struts.devMode" value="true" />
- <constant name="struts.custom.i18n.resources" value="message" />
- <constant name="struts.i18n.encoding" value="UTF-8" />
- <!-- Add packages here -->
- <package name="auth" extends="struts-default">
- <action name="login" class="com.tim4lover.ssh2.auth.action.LoginAction">
- <result name="input">/login.jsp</result>
- <result name="error">/error.jsp</result>
- <result name="success">/welcome.jsp</result>
- </action>
- </package>
- </struts>
message.properties
- loginPage=登录页面
- errorPage=错误页面
- successPage=成功页面
- failTip=对不起,您不能登录!
- successTip=欢迎,{0},您已经登录!
- user=用户名
- pwd=密码
- login=登录
message.properties文件的编码格式为utf-8,还必须用native2ascii命令来处理该国际化资源文件。
src目录下新建 toUTF-8.bat,运行。
toUTF-8.bat
- native2ascii -encoding UTF-8 message.properties message_zh_CN.properties
运行,生成message_zh_CN.properties
6.新建action类
- package com.tim4lover.ssh2.auth.action;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- public class LoginAction extends ActionSupport {
- private static final long serialVersionUID = 1L;
- private String username;
- private String password;
- @Override
- public String execute() throws Exception {
- if("admin".equals(username) && "123456".equals(password)) {
- ActionContext.getContext().getSession().put("user", getUsername());
- return SUCCESS;
- }else {
- return ERROR;
- }
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
7.配置struts.xml,action到jsp的映射。