[环境:myeclipse8+jboss5]
先看一下最终的目录结构:
(如图,有7个导入的.jar包,它们在默认的myeclipse安装目录下,
我的是:D:\MyEclipse-8.6\configuration\org.eclipse.osgi\bundles\109\1\.cp\data\2.1\core)
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</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>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
解析:在web.xml中以前主要就是servlet标签,现在是filter完成过滤请求的功能。/*是通配符,表示任何请求都要经过此filter先处理。(注:在此例中它未被赋予作用)
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<form action="login.action" method="post">
username:<input type="text" name="username" /><br/>
password:<input type="password" name="password" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
解析:action="login.action" ,默认的是以.action结尾,提交的请求信息"username"、"password"交由下面的LoginAction类处理。
package com.test.action;
public class LoginAction {
private String username;
private String password;
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;
}
public String execute()throws Exception{
return "success";
}
}
解析:使用Action类控制导航业务数据,根据上面客户端login.jsp提交的信息,编写出两私有实例属性"username"、"password"及相应的getter/setter方法。
当客户端提交过来信息时,自动调用Action类的set方法,set到实例属性里面去。login.jsp中定义了username那么就
在LoginAction类中去寻找setUsername()方法,而非去比对属性名字。
此类由Struts框架自动调用,来完成客户端发送过来信息的处理,完成赋值set取值get;之后再自动调用execute()方法。
result.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
username:${requestScope.username }<br/>
password:${requestScope.password }
</body>
</html>
解析:这是提交请求之后显示的页面。${requestScope.username} 即获取request范围内的username用户名值。
struts.xml:(对于汉字传值不显示问题,注意要加上<constant name="struts.i18n.encoding" value="gb2312"/>在<struts></struts>内)
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="com.test.action.LoginAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
解析:package标签 name="包名(此指web项目名)" 它继承自包struts-default
action标签 name="前面客户端login.jsp中form标签中的请求目标名(以.action后缀)" class="处理请求的Action类全路径类名"
result标签/处理完后转到的页面;可不给出name属性,因为execute()方法返回值只有"success"这一个,系统自动匹配,不会歧义。
运行流程:
当提交请求(login.jsp)时,它会提交到“login.action”,.action会由struts2进行自动处理, 它找到.action前面的名字login,匹配到struts.xml中action标签的name属性,接着由action标签中 class属性对应的Action类生成实例对象来处理login.action,这时LoginAction类发现客户端发送 过来的请求,自动set方法赋值,接着自动执行execute()方法,返回字符串"success",这就是result 标签中name属性的值,也就是说这个name属性匹配execute()方法的返回值后才会跳转到result.jsp页面。
它们怎么运行的:
1、 struts2容器收到login.action请求,从web.xml获取设置,org.apache.struts2.dispatcher.FilterDispatcher是所有应用(包括*.action)的入口点。
2、 struts2在struts.xml中找到Action类(LoginAction),并调用它的execute方法。
3、 execute方法返回SUCCESS,struts2收到SUCCESS标志,按照映射关系,把HelloWorld.jsp返回客户端。
4、 当HelloWorld.jsp开始运行,若调用<s:property value="username" />则会调用LoginAction类getUsername方法,把结果显示在页面上。