一、Struts2体系结构 :

1、Web浏览器请求一个资源。

2、过滤器Dispatcher查找方法,确定适当的Action。

3、拦截器自动对请求应用通用功能,如验证和文件上传操作。

4、Action的execute方法通常用来存储和重新获得信息。

5、结果被返回到浏览器。 



二、Struts2的具体工作流程

1、基本流程图





2、详细解释

(1)  客户端(Client)向Action发用一个请求(Request)

(2)  容器(Container)通过web.xml映射请求,并获得控制器(Controller)的名字

(3)  容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter

(4)  控制器(Controller)通过ActionMapper获得Action的信息

(5)  控制器(Controller)调用ActionProxy

(6)  ActionProxy读取struts.xml文件获取action和interceptor stack的信息。

(7)  ActionProxy把request请求传递给ActionInvocation

(8)  ActionInvocation依次调用action和interceptor

(9)  根据action的配置信息,产生result

(10) Result信息返回给ActionInvocation

(11) 产生一个HttpServletResponse响应

(12) 产生的响应行为发送给客服端。

三、搭建Struts2开发环境

1、找到开发Struts 2的应用需要用到的jar包。

2、编写Struts 2的相应Action类并在struts.xml中作相应的配置。

3、在web.xml中加入Struts 2 MVC启动框架配置。

开发Struts 2 最少用到的jar文件:

Struts-core-2.x.x.jar : Struts 2 框架的核心类库

xwork-2.x.x.jar : XWork类库,Struts 2 在其上构建

ognl-2.6.x.jar : Object Graph Navigation Language , Struts 2 框架通过其读写对象的属性。

freemarker-2.3.x.jar : Struts 2 的UI标签的模版使用 Freemarker编写。

commons-logging-1.1.x.jar : ASF出品的日志包。

commons-fileupload-1.2.1.jar : 文件上传组件。



四、配置文件详解

1、struts.xml

默认情况下,会从“\WEB-INF\classes”下加载struts.xml文件,通过Eclipse开发是在src目录下建立struts.xml文件,发布后会自动拷贝到“\WEB-INF\classes”目录下。struts.xml是Struts 2 的核心配置文件,主要用于配置开发人员编写的action。



(1)基本格式如下:

<?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="test" extends="struts-default"/>

   <action name="Login1" class="com.chen.LoginAction1" >

   <result>/loginResult.jsp</result>

   <result name="input">/login1.jsp</result>

   </action>

   </package>

</struts>

①通过反射机制将请求参数注入到"com.chen.LoginAction1"类中

②调用"com.chen.LoginAction1"类的execute方法,该方法的原型为:public String execute() throws Exception;

③ 根据execute方法返回的String类型的字符串(如"input"),在配置文件中查找该字符串对应的页面,并转到该页面。



(2)标签详解

<package>标签

如果要配置<Action>的标签,那么必须要先配置<package>标签,代表的包的概念。包含的属性:

name         包的名称,要求是唯一的,管理action配置。

extends      继承,可以继承其他的包,只要继承了,那么该包就包含了其他包的功能,一般都是继承struts-default

namespace    名称空间,一般与<action>标签中的name属性共同决定访问路径,常见的配置如下:

namespace=""     -- 默认的名称空间(访问的方式和namespace="/"是一样的)

namespace="/"    -- 根名称空间

namespace="/aaa" -- 带有名称的名称空间,这样请求action时,URL是/namespace/name的形式

abstract         -- 抽象的。这个属性基本很少使用,值如果是true,那么编写的包是被继承的。     



<action>标签

代表配置action类,包含的属性:

name              和<package>标签的namespace属性一起来决定访问路径的。

class             配置Action类的全类名(默认值是ActionSupport类)

method            Action类中执行的方法,如果不指定,默认值是execute方法



<result>标签

action类中方法执行,返回的结果跳转的页面

name      结果页面逻辑视图名称

type        结果类型(默认值是转发,也可以设置其他的值)

注:

设置Struts2默认的Action:

在地址栏上输入一个不存在的action请求,程序会报404的异常。但是在<package>标签中通过<default-action-ref name="指定action标签name属性"></default-action-ref>来设置默认的Action。当在配置文件中找不到相应的action时,就由默认的action进行处理。

设置Action默认处理类:

在地址栏上输入一个正确的action请求,但是<action>标签中的class属性没有写具体的Action类也会报异常。在<package>标签中通过<default-class-ref class="指定action类的全路径"></default-class-ref>来设定action的默认处理类。



2、多个struts的配置文件的合并

为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。可以在使用<include>标签来引入其他的struts_xx.xml的配置文件。例如:

<struts>

<include file="conf/struts_user.xml"></include>

<include file="conf/struts_editer.xml"></include>

</struts>

这样可以把struts_user.xml和struts_user.xml各自编写,并放到一个文件目录下,使用时strus.xml直接包含这两个配置文件即可。需要注意的是struts_user.xml和struts_user.xml也必须按照strus的配置文件格式来写。



3、web.xml的配置

要使用strus2框架,必须在web.xml中配置相应的过滤器。通常情况下web.xml的核心配置如下:

**********省略了web.xml的一般配置信息**********

<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>

************省略了后续代码**********

通过<url-pattern>/*</url-pattern>使得struts拦截所有URL请求。而StrutsPrepareAndExecuteFilter中的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后Struts2对用户的每一次请求处理将使用内存中的数据。Filter 过滤器是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的类容进行处理,通常用于权限、编码转换等场合。



五、实现Action

1、把Action看作是POJO类

POJO(Plain Ordinary Java Object)简单的Java对象。简单来说,没有继承某个类,没有实现接口,就是POJO的类。我们直接写一个POJO类,把它当作struts2对应的一个Action类。这个类必须包含处理逻辑所需要的属性及相应的get、set方法,并且提供Struts2调用的execute方法。但通常不推荐这样做,这样不利于统一接口。

2、实现Action接口

Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法,我们可以自己来实现。

常量值如下所示:

SUCCESS       -- 成功.

INPUT         -- 用于数据表单校验.如果校验失败,跳转INPUT视图.

LOGIN         -- 登录.

ERROR         -- 错误.

NONE          -- 页面不转向.

3、继承ActionSupport类,而该类实现了Action 、Validateable 、 ValidationAware 、TextProvider、LocaleProvider,Serializable接口。我们只需要根据实际情况重写一些其中的方法就可以满足需求。

六、实例演示

利用struts2的框架来实现一个用户登录校验的例子。

1、在eclipse中创建一个web工程,并导入struts2的关键jar包到WEB-INF的lib目录下。并在WebContext根目录下创建web.xml,在源文件目录src下创建struts.xml。再创建login.jsp和loginResult.jsp两个jsp文件,用于显示登录界面和登录成功界面。最后创建一个Action类,放在自定义的包下。目录和文件创建完毕,总体目录文件结构如下:

2、配置web.xml和struts.xml两个文件

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" version="3.1">
<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>
</web-app>

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="LoginTest" extends="struts-default">
<action name="Login" class="com.chen.LoginAction" >
<result>/loginResult.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>

3、编写jsp文件

login.jsp源码如下:

<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>登录系统</title></head>
<body><br><br><br>
<div align="center">
<s:text name="welcome message:"/>
${requestScope.message}
<s:form action="Login" method="POST" theme="xhtml">
<s:textfield name="adminUserName" label="用户名"/>
<s:password name="adminUserPassword" size="21" label="密码"/>
<s:submit value="提 交"/>
</s:form>
</div>
</body>
</html>

注意到login.jsp中使用了struts2的标签,所以需要有

<%@ taglib prefix="s" uri="/struts-tags"%>

${requestScope.message}显示出登录信息,message的设置在Action类中。

form中设置action="Login",这与struts.xml中的

<action name="Login" class="com.chen.LoginAction" >保持一致。也就是说,这个表单的数据会提交给com.chen.LoginAction来进行处理。

loginResult.jsp源码如下:

<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>验证通过</title>
</head>
<body>
${message}
</body>
</html>

4、编写Action类

我们采用继承ActionSupport类的方法来编写自定义的Action类LoginAction。源码如下:

注:这里为了便于测试,直接把用户名和密码都设为admin。实际应用中一般要连接数据库。

package com.chen;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 执行用户验证的方法
*/
public String execute() throws Exception {
if("admin".equals(adminUserName)&&"admin".equals(adminUserPassword))
message=adminUserName+"登录成功!";
else{
message=adminUserName+"登录失败!";
return INPUT;//转到输入界面
}
return SUCCESS;//转到登录成功界面
}
public String adminUserName;//用户名
public String adminUserPassword;//密码
public String message;//execute()执行完后返回的消息
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;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
} }

5、编写完毕,将项目运行在Tomcat上,测试即可。

原始界面:



登录失败:

登录成功:

Struts2基本概念的更多相关文章

  1. Struts2的概念

    Struts2的概念 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数 ...

  2. Struts2框架学习(一)——Struts2的概念及搭建

    一.Struts2的概念 使用优势:1)自动封装参数 2)参数校验 3)结果的处理(转发|重定向) 4)国际化 5)显示等待页面 6)防止表单重复提交 Struts2具有更加先进的架构以及思想 Str ...

  3. struts2一些概念介绍和标签的使用

    依赖注入 模块包含 struts.xml的模块包含格式 <include file="xx.xml" > OGNL 对象导航语言   有个超大的好处就是根据对象访问属性 ...

  4. Struts基本概念

    内容源自: Struts2基本概念 一.struts2体系结构: 1.Web浏览器请求一个资源.2.过滤器Dispatcher查找方法,确定适当的Action.3.拦截器自动对请求应用通用功能,如验证 ...

  5. 【SSH】---【Struts2、Hibernate5、Spring4】【散点知识】

    一.Struts21.1.Struts2的概念Struts2是一个用来开发MVC应用程序的框架,它提供了Web应用程序开发过程中的一些常见问题的解决方案:    ->对来自用户的输入数据进行合法 ...

  6. Springboot,SSM及SSH的概念、优点、区别及缺点

    Springboot的概念: 是提供的全新框架,使用来简化Spring的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不在需要定义样板化的配置.此框架不需要配置xml,依赖于像MAVEN这 ...

  7. (一)、Struts第一天

    (一).Struts第一天 1. JavaWeb知识回顾 n 客户端编程 HTLM/CSS/JS n XML技术 会写XML * 基本语法 * DTD * Schema 会读XML * Dom4J读取 ...

  8. SpringBoot,SSM和SSH

    Springboot的概念: 是提供的全新框架,使用来简化Spring的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不在需要定义样板化的配置.此框架不需要配置xml,依赖于想MAVEN这 ...

  9. 【struts2】核心概念

    1)FilterDispatcher Struts2的前端控制器,也是Struts2的MVC中的控制器部分.在实际开发中,只需要在web.xml中配置一次即可,如下所示: <filter> ...

随机推荐

  1. linux-3.2.36内核启动2-setup_arch中的内存初始化1(arm平台 分析高端内存和初始化memblock)【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/17093307 上一篇微博留下了这几个函数,现在我们来分析它们         sanity_c ...

  2. 五、 java中数组

    定义数组的两种方式 class myarray1 { public static void main(String[] args) { //1.如何定义一个数组 //1.1数组的声明 String[] ...

  3. asp传递参数的几种方式

    把下列代码分别加入a.asp和b.asp的<body></body>中,点提交,就可以将a.asp文本框的内容传给b.asp并显示出来 a.ASP <form actio ...

  4. vSphere Client 更改 ESX/ESXi 主机的端口

    https://blog.csdn.net/hanzheng260561728/article/details/51283808?locationNum=8&fps=1

  5. Java 基础【05】你的多继承纳?

    Java省略了许多很少用到,缺乏了解,混淆功能的C + +,在我们的经验中带来更多的悲伤大于收益 . -----James Gosling James Gosling 这个人大家应该很熟悉,就是最初设 ...

  6. CTSC2017游记&心得记

    先来占个坑,骗点访问量 相册地址,戳这里 Day-1 一大清早就被叫了起来,赶去回车站....结果到了那里发现早了快1h?exm?是谁一早清早扰人清梦QAQ 杭州东转车,看到5号检票口被乘警团团围了起 ...

  7. php 打印今天,昨天,本周,上周,当月,上月,本季,上季,今年,去年数据

    if($filter['mode']) { switch ($filter['mode']) { case 1://今天的数据 $time_start = date("Y-m-d H:i:s ...

  8. Golang协程与通道整理

    协程goroutine        不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换.Go在底层进行协助实现      涉及系统调用的地方由Go标准库协助释放CPU      总之,不通 ...

  9. android特效集合

    https://github.com/Trinea/android-open-project http://www.cnblogs.com/hawkon/p/3593709.html http://i ...

  10. Java代理学习笔记

    代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...