Struts2概论

1、MVC原理

MVC(Model-View-Controller),程序设计理念

视图不用多说,html、jsp等

控制器,中转站,分配各个组件应当做什么,接受参数并跳转其他处理 servlet、action

模型

Struts中的ActionFrom一集业务JavaBean实现。对表单数据进行封装,与页面表单交互并传递数据;JavaBean用于处理真正的业务请求

2、产生

Struts+webWork

3、结构体系

客户端发送请求-->web.xml中的StrutsPrepareAndExecuteFilter-->struts.xml-->action-->result.jsp(或者其他action等等)

Struts2环境配置

1、lib中导入jar文件

我使用的是Struts2.3.24,9个jar

struts2-core-2.1.24.jar

xwork-core.2.1.6.jar

ognl-2.7.3.jar

commons-logging-1.0.4.jar

freemarker-2.3.15.jar

commons-io-1.3.2.jar

commons-fileupload-1.2.1.jar

javassist-3.11.0.GA.jar

commons-lang3-3.2.jar

2、web.xml中配置过滤器

过滤器的名为struts2,class路径为

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

3、src下面新建struts.xml

格式:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<constant ......../>

...

<package>

...

</package>

</struts>

Action对象

1、Actionj接口

public interface Action{

public static final String SUCCESS="success";

public static final String NONE="none";

public static final String INPUT="input";

public static final String LOGIN="login";

public static final ERROR="error";

public String execute() throws Exception;

}

主要说明一下INPUT常量,当struts经过validate验证失败的时候,系统自动返回INPUT,所以会在result页面中寻找name为INPUT的属性

2、创建Action对象

可以直接创建一个class,然后实现Action接口,实现execute()方法

创建一个class,继承自ActionSupport类,只需要在该类中实现execute()即可。建议使用,因为ActionSupport是一个经过了考验的规范class,它实现或者继承了validate等多个接口,使用它可以简化我们的开发。

3、请求参数的注入

在Struts2框架中,表单的提交的数据会自动注入到与Action对象相对应的属性。它与Spring框架中的IoC的注入原理相同,通过Action对象为属性提供setter方法注入

要求:

jsp中表单的name属性与Action中对应的属性的setter方法对应。要注入属性值的Action对象,必须为该属性提供setXXX()方法,因为Struts2的内部实现是按照JavaBean规范中提供的setter方法,自动为属性注入值

所以一般在Action中注入的属性的属性名与表单对应控件的name值相等,且该属性提供getXXX()、setXXX()方法

域模型DomainModel

我们使用有相同点的属性都喜欢把它封装,这样比较结构化,简单明了。第一种方式注入请求参数在参数过多的情况下可能造成action中的代码过多

将一些属性信息封装成一个实体对象的属性。操作领域对象的方法,在Action对象中引用某一实体对象,并且http请求的参数值可以注入到实体对象的属性上,这种方式i就是struts2提供的DomainModel的方式

注意:使用域模型的时候,jsp中的表单空间的name属性应该与Action中的对象和bean中的属性对应,格式为 对象.属性 ,例如:user.name

public Class User{
private String name;
private String password;
private int age;
public void setName(String name){this.name=name;}
public String getName(){return name;}
public void setPassword(String password){this.password=password;}
public String getPassword(){return password;}
public void setAge(int age){this.age=age;}
public int getAge(){return age;}
} public Class UserAction extends ActionSupport{
private User user;
public void setUser(User user){this.user=user;}
public User getUser(){return User;}
public String execute() throws Exception{
return "success";
}
} <body>
<s:form action="userAction" method="post">
<s:textfield name="user.name" label="用户名"/>
<s:password name="user.password" label="密码" />
<s:textfield name="user.age" label="年龄"/>
<s:submit value="注册"/>
</s:form>
</body>

驱动模型ModelDriven

在域模型DomainModel中,虽然struts2的Action对象可以通过直接定义实例对象的引用来调用实体对象进行相关的操作,但要求的参数必须是指定参数对应的实体对象,例如上李忠需要指定参数名称为user.name这种形式,有点不方便

驱动模型不需要指定参数所属的对象引用。Struts2的API中,提供了一个名为ModelDriven的接口,Action对象可以通过实现此接口获取指定的实体对象,获取的方式是实现ModelDriven提供的getModel()方法进行获取,其语法格式为: T getModel();

处理流程

Struts2实例化Action对象,判断Action对象是否实现ModelDriven接口,如果实例化了该接口,就会调用getModel()获得实体对象模型并将其返回。后面就可以直接使用该对象的属性了。

public Class User{
private String name;
private String password;
private int age;
public void setName(String name){this.name=name;}
public String getName(){return name;}
public void setPassword(String password){this.password=password;}
public String getPassword(){return password;}
public void setAge(int age){this.age=age;}
public int getAge(){return age;}
} public Class UserAction extends ActionSupport implements ModelDriven{
private User user;
@Override
public User getModel(){
return this.user;
}
public String execute() throws Exception{
return "success";
}
} <body>
<s:form action="userAction" method="post">
<s:textfield name="name" label="用户名"/>
<s:password name="password" label="密码" />
<s:textfield name="age" label="年龄"/>
<s:submit value="注册"/>
</s:form>
</body>

4、Action中方法的调用

一般的,执行Action默认执行其execute()方法,但是如果将所有的控制层代码都写在execute方法中,并不是特别理想,复用性,修改难。

所以我们希望可以走Action中的其他方法

静态方法调用:

在Struts.xml中的Action标签中有method属性,可以指定进入Action的时候调用的方法,使用该方法替换execute()的作用

动态方法调用

Dynamic Action(动态 Action)

处理方式是通过请求Action对象中的一个具体的方法来实现动态的操作。具体的操作方式是通过在强求的Action的URL地址后加上请求字符串(方法名称),与Action中的方法进行匹配。例如:/userAction!add   请求userAction的add方法

struts2默认支持动态方法调用,如果需要关闭,可以在struts.xml设置常量:

name="struts.enable.DynamicMethodInvocation" value="false"/>

动态Action的应用demo(只代码未测试):

主要代码,部分删减
public class UserAction extends ActionSupport{
private String info;
public String add() throws Exception{
info="添加用户信息";
return "add";
}
public String update() throws Exception{
info="更新用户信息";
return "update";
}
public String getInfo(){
return info;
}
public void setInfo(String info){
this.info=info;
}
} struts.xml:
<struts>
<package name="myPackage" extends="struts-default">
<action name="userAction" class="com.action.UserAction">
<result name="add">user_add.jsp</result>
<result name="update">user_update.jsp</result>
</action>
</package>
</struts> user_add.jsp:
<body>
<font color="red">
<s:property value="info"/>
</font>
</body> user_update.jsp:
<body>
<font color="red">
<s:property value="info"/>
</font>
</body> index.jsp:
<body>
<a href="userAction!add">添加用户</a>
<br/>
<a href="userAction!update">更新用户</a>
</body>

demo

Struts2的配置文件:

struts-default.xml   位于struts2-core-2.3.24.jar的.org.apache.struts2包中

struts-plugin.xml    位于struts提供的各个插件的包中

struts.xml              Web应用默认的struts2配置文件在src目录下

struts.properties     Struts2框架中属性配置文件,也位于src目录下

web.xml                  在该文件中也可以设置Struts2的一些信息

struts搜索信息的顺序为从上到下,如果在前面声明了一个常量后面再此声明会将其覆盖掉

struts2的包配置

类似java中的包,提高可读性,简化java工作

<package name="user" extends="struts-default" namespace="/user">

......

</package>

package的属性以及说明

name  声明包的名称,以方便在其他处引用此包,此属性必须

extends 用于声明继承包,也就是它的父包

namespace 指定命名空间,也就是访问此包下的Action需要访问的路径

abstract  将包声明为抽象类型(包中不定义Action)

命名空间设置

在JavaWeb开发中Web目录通常以模块进行划分,录用户的首页可以定义在"/user"目录中,其访问地址为"/user/index.jsp"。Struts2命名空间指定一个Action的访问路径,它的使用方法是通过配置文件struts.xml的包声明中,使用namespace属性进行声明

<struts>
<package name="book” extends="struts-default" namespace="/bookmanager">
......
</package>
</struts>

查找action的顺序:

现在指定package中查找,然后在同一个struts.xml中的其他package中查找,再在它的父包中查找,全部找不到才报错404

Action相关配置

Struts2中的Action是一个控制器的角色

<action name="userAction" class="com.action.UserAction" method="save">
<result>/success.jsp</result>
</action>

action中元素的属性以及说明

name  用于配置Action对象被请求的URL地址

class  指定Action对象的类名

method 指定请求Action对象时调用哪一个方法

converter  指定Action类型转化器的类

使用通配符实现简化配置

struts2的通配符有两个:*表示0个或多个字符;\表示转义字符

<struts>
<package name="myPackage" extends="struts-default" namespace="/">
<action name="*_*" class="com.action.{1}Action" method="{2}">
<result name="success">/{2}.jsp</result>
</action>
</package>
</struts>

通配符的优先级:

(1)如果struts.xml里面有对应的action name .就算它有其他通配符匹配的,都优先对应完全相同的.

比如 有一个 action name 是 "user_add"  还有一个是 "user_*" .现在,来一个请求是 "user_add.action " .那么,它会优先匹配"user_add " ..其实,这个很好理解..

(2)如果一个action name对应于两个带通配符的action name 那么,需要看这个配置谁在前面.它匹配写在前面的

比如 有一个 action name 是 "*_*"  还有一个是 "user_*" .现在,来一个请求是 "user_add.action " .那么,它会优先匹配写在前面的...

任何带"*"的action name 优先权都是一样的...不是说带一个"*"的优先权就比带两个"*

" 的高.

Struts2的开发模式

1、实现与servletAPI的交互

ActionContext对象的一些方法:

public static ActionContext getContext()

public Object get(Object key)

public Map getSession()

public Map getApplication()

Struts2中提供了Map类型的request、session与application,可以从ActionContext对象中获得。ActionContext对象位于com.opensymphony.xwork2包中,它是Action执行的上下文,其常用API如下:

实例化ActionContext: 使用ActionContext对象的getContext()方法得到ActionContext的实例化对象。getContext()是静态方法可直接调用

ActionContext context=ActionContext.getActionContext();

获取Map类型的request,使用ActionContext对象的get()方法获取

Map request=ActionContext.getContext().get("request);

获取session也可以在get()里面获取,但是ActionContext也特意留了获取session的方法getSession()

application也与session类似

Map session=ActionContext.getContext().getSession();
Map session1=ActionContext.getContext().get("session"); Map application=ActionContext.getContext().getApplication();
Map application1=ActionContext.getContext().get("application");

手打struts知识点的更多相关文章

  1. 通过Struts了解MVC框架,兼说如何在面试中利用Struts证明自己

    虽然目前Struts MVC框架不怎么用了,但它确是个能帮助大家很好地入门Web MVC框架,而且,一些历史项目可能还用Struts,反正技多不压身,大家如果能在面试中通过项目证明自己Struts这块 ...

  2. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  3. 使用Struts框架,实现用户登陆功能

    前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...

  4. 谈谈你对 Struts 2 的理解

    谈谈你对Struts的理解. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子 ...

  5. Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析

    Struts2官网:http://struts.apache.org/ 目前最新版本:Struts 2.3.24 Struts1已经完全被淘汰了,而Struts2是借鉴了webwork的设计理念而设计 ...

  6. 程序员必懂:javaweb三大框架知识点总结

    原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...

  7. Struts 2简单配置分析

    要配置Struts 2,首先先要有Struts 2的Jar包,可以去Struts的官网下载(http://struts.apache.org/),这里有3个GA版本可以选择下载,我选择的是最新的2.2 ...

  8. 重新学习struts

    这就是所谓的一边工作一边学习. 今天准备把给公司写个管理页面,按照之前的路数,写起来应该挺快,但是不太规范.也就沉下心来学习一下了. 第一个学习的是,之前,在学校,听师兄说过,对页面编码可用inter ...

  9. 初次接触GWT,知识点总括

    初次接触GWT,知识点概括 前言 本人最近开始研究 GWT(Google Web Toolkit) ,现将个人的一点心得贴出来,希望对刚开始接触 GWT的程序员们有所帮助,也欢迎讨论,共同进步. 先说 ...

随机推荐

  1. 自定义WPF控件(MyTextBox、MyDatePicker、MyDataGrid)

    方案一:样式与代码结合 按照UserControl的前后台结合的方式编写MyControl,前台写样式,后台写功能.规则等(创建一个UserControl,然后修改一下即可) 方案二:样式与代码分离 ...

  2. You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)

    JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...

  3. p2751 Job Processing

    如果单单只安排过程1的时间最短,很容易算出来.用优先队列取最小,加上增量后再放回就行.对过程2也进行这样的操作.将过程1第一个完成的在过程2最后一个完成.以样例来说,过程1:1,1,2,2,3,过程2 ...

  4. dsu on tree练习

    dsu on tree主要是处理一些有根树子树询问的操作, 作用与点分治和线段树合并类似. 一般无根树询问所有树链信息的直接就点分了, 有根树的话一般用线段树合并或dsu on tree, 线段树合并 ...

  5. Spring boot(四)thymeleaf使用介绍

    在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用.thymeleaf 是新一代的模板引擎,在spring4. ...

  6. Shiro中Realm

    6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系   即用户-角色 ...

  7. javaweb项目静态资源被拦截的解决方法

    <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>/*< ...

  8. jackson实体转json时 为NULL不参加序列化的汇总

    首先加入依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson ...

  9. Python序列化-pickle和json模块

    Python的“file-like object“就是一种鸭子类型.对真正的文件对象,它有一个read()方法,返回其内容.但是,许多对象,只要有read()方法,都被视为“file-like obj ...

  10. [CodeForces - 447C] C - DZY Loves Sequences

    C - DZY Loves Sequences DZY has a sequence a, consisting of n integers. We'll call a sequence ai, ai ...