>

【乐百家前段】Struts2的配置文件

- 编辑:乐百家599手机首页 -

【乐百家前段】Struts2的配置文件

乐百家前段 1

2、 Struts 主题配置文件

  Struts2 的为主配置文件为 struts.xml,日常坐落于 src 目录中。 Struts2 安顿利用包来管理Action。包的效果与 Java 中包的成效相像,用于管理生龙活虎组专业成效有关的 Action。在实质上采纳中,应将后生可畏组专门的学业作用相关的 Action 放在同多少个包下。
  注意: struts.xml 中的包与 Action 类所在的包无关。

Struts 2 property tag标签

在 struts2入门类别二之Hello World  中的HelloWorld.jsp,大家选取了那般的一句话:

<s:property value="messageStore.message" />

二个常用的采纳办法是调用Action中的公开getter方法获取值作为value属性的属性值,然后struts2会将以此值代替property标签重回给浏览器。

那边在说三次,就二回咯,正如在Hello World教程中所探讨的,messageStore.message提醒Struts2到Action类去第四回调用getMessageStore(卡塔尔(قطر‎方法。该措施调用重返二个MessageStore对象 而 .message部分提示Struts 2调用MessageStore对象的getMessage(卡塔尔(英语:State of Qatar)方法。getMessage方法再次来到多个字符串,该字符串将包括在回来到浏览器的HTML中。

Struts2 property标签的二个卓殊管用的特征是它将自行地将最常用的数据类型(int、double、boolean卡塔尔国转换为字符串等价值。为了演示那一个特点,让我们向HelloWorldAction类中增添贰个静态int变量。

 1 package action;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 import model.MessageStore;
 6 
 7 public class HelloWorldAction extends ActionSupport {
 8     private MessageStore messageStore;
 9 
10     public String execute() {
11         messageStore = new MessageStore() ;
12         
13         return SUCCESS;
14     }
15 
16     public MessageStore getMessageStore() {
17         return messageStore;
18     }
19     //添加一个static int变量
20     private static int helloCount = 0;
21     
22     public int getHelloCount() {
23         return helloCount;
24     }
25 }

每一回execute(卡塔尔(قطر‎方法被调用时,我们便让helloCount

 1 package action;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 import model.MessageStore;
 6 
 7 public class HelloWorldAction extends ActionSupport {
 8     private MessageStore messageStore;
 9 
10     public String execute() {
11         //每次调用helloCount  
12         helloCount  ;
13         messageStore = new MessageStore() ;
14         
15         return SUCCESS;
16     }
17 
18     public MessageStore getMessageStore() {
19         return messageStore;
20     }
21     //添加一个static int变量
22     private static int helloCount = 0;
23     
24     public int getHelloCount() {
25         return helloCount;
26     }
27 }

在HelloWorld.jsp的h2标签下增添property标签

 1 <!DOCTYPE html>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
 3 <%@ taglib prefix="s" uri="/struts-tags" %>
 4 <html>
 5   <head>
 6     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7     <title>Hello World!</title>
 8   </head>
 9   <body>
10     <h2><s:property value="messageStore.message" /></h2>
11     <!-- 显示helloCount的值 -->
12     <p>I've said hello <s:property value="helloCount" /> times!</p>
13   </body>
14 </html>

那样getHelloCount(卡塔尔(英语:State of Qatar)方法重返一个整数品种,Struts 2将它转变为品种字符串,并将其放入p标签的基点中。

当心:就算helloCount是静态的,但它的getter方法不是静态的,对于struts2来讲,getter方法必须不能够是静态的!!

只要措施再次来到值是一个object类型,那么就能够调用该项指标toString(卡塔尔国方法,Of course,我们应当总是重写override模型类的toString(卡塔尔(英语:State of Qatar)方法。在MessageStore类中加多toString(卡塔尔(قطر‎方法,如下:

public String toString() {
    return message   " (from toString)";
}

继续在HelloWorld.jsp中增加如下代码:

<p><s:property value="messageStore" /></p>

运作如下:

乐百家前段 2

 大家在本教程中介绍了成都百货上千,不过大家只谈谈了怎样行使Struts 2标签。有关Struts 2标识的更加多音讯,请参阅Struts 2 Tag Reference。

requiredstring

表明字段的值既不是null、亦非空荡荡。

参数:

  • 田野先生Name:要验证的字段名
  • trim:是不是去掉首尾空格
<validators>
    <field name="userName">
        <field-validator type="requiredstring">
            <message>Please input the userName!</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <param name="trim">false</param>
            <message>Please input the password!</message>
        </field-validator>
    </field>
</validators>

Beangle 2.4.0公布。 Beangle是提供符合规律公司支付的工具包。主要用来以下多少个地方:该工具包详细表达如下:beangle-library commons 提供字符串、压缩、再配备、csv等根基api的赞助方法 model 提供对实体映射、查询存款和储蓄、调换的根基api rule 对法规定义、使用和存款和储蓄的apibeangle-struts2 提供struts2的约定优先配置和功底Action beangle-database beangle-security 提供权限管理方式和认证部分 beangle-webapp 提供样例App 此番更新的版本中提供了程序开垦新的特点,并修复了2.3.0 遗留的不当,首要更新有:Beangle Model 包变化扩展了越多扶持HierarchyEntity的佑助方法扩展了EnabledEntityRailsNameStrategry命名战略在命名当先30长度之后,日志报错。移动全局table.properties到beangle/,局地table.properties从META-INF/移动到META-INF/beangle/Beangle Struts2 变化下落beangle-struts2-lagecy的表面信任性为0,该包将要未来版本中移除。移动beangle-struts2-convention关于freemarker的代码到beangle-struts2-view包中。Struts2-View 变化修复了[@b.a标签不辅助id属性的荒诞。修复了当未有数据时,grid未有展现标题的败笔。修复了日期选拔控件中,value只好是字符串方式的大错特错。扩展了gridfilter标签。扩大了startend标签。Struts2-Convention 变化挪动convention-route.properties,从META-INF/到META-INF/beangle/。关于freemarker匡助的剧情,移动到struts2-view中。越来越多更新实际情况参见 Release Notes程序下载地址:

1.1、 struts-default.xml(重要)

  Struts2 的暗许主旨配置文件,此中最首要定义了 11 种回到类型、35 种拦截器,及拦截器栈。个中较首要的暗中同意拦截器栈中饱含 20 种拦截器。是 Struts2 宗旨功效的反映。

位置:struts2-core-2.3.24.jar!/struts-default.xml

乐百家前段 3

回到类型

乐百家前段 4

拦截器

乐百家前段 5

私下认可拦截器栈

 

访问 ValueStack

  • ObjectStack: 直接通过成分的称呼进行探访。
  • ContextMap: 须要在初阶加三个 #

例如说 ObjectStack 和 ContextMap 中都贮存了二个 User,而 User
有总体性 username,那么我们可以通过如下代码实行访谈:

jsp 中:

<%--不加修饰符是在栈中查找对象是否有getUsername方法
可以通过[n].来指定从第几个开始查找,n从0开始
如果没找到,就会报错
--%>
<s:property value="username" />

<%--加修饰符# 是在 map 中查找 key 为 user 的 值
如果存在 session 中,则访问路径为 #session.user.username
--%>
<s:property value="#user.username" />

Action 中:

ValueStack vs = ActionContext.getContext().getValueStack();
// setValue 方法的第一个参数是 OGNL 表达式,不加#表示放到栈中
vs.setValue("name", "Mike");// 在栈中查找是否有对象有 setName 方法
vs.setValue("#name", "Mike");// 往 map 中存入 key 为 name,值为 Mike 数据。

// set 方法是对 栈 进行操作
// 如果栈顶是 map,则把数据放入map,否则在栈顶新建一个 map,并存入数据。
vs.set("username", "Jane");

1.2、 default.properties(重要)

概念了 Struts2 中用到的常量的暗中同意值。

其岗位在:

struts2-core-2.3.24.jar! /org/apache/struts2/default.properties

乐百家前段 6

default.properties

struts.i18n.encoding=UTF-8

点名暗许编码集,功用于HttpServletRequest的setCharacterEncoding方法和freemarker、velocity的出口

#struts.objectFactory = spring

与Spring集成时,用于将 Action 交由 Spring 容器来治本。其在 Struts2中默许是破产的(私下认可注释卡塔尔(قطر‎。
struts.objectFactory 的 开 启 会 使 另 风华正茂 常 量 , 按 名 称 自 动 装 配 Bean的 常 量Beanstruts.objectFactory.spring.autoWire 自动起效果。该常量暗中认可是展开的

struts.objectFactory.spring.useClassCache = true

与Spring集成时,对象工厂使用类缓存,开垦形式无效。暗中同意开启。

struts.multipart.maxSize=2097152

上传文件(总卡塔尔(قطر‎的大大小小节制。单位:字节

struts.action.extension=action,,

该属性内定须求Struts2拍卖的伸手后缀,该属性的默许值是action和空,即全部相称*.action的呼吁都由Struts2管理。借使顾客须求钦命五个诉求后缀,则多个后缀之间以匈牙利(Magyarország卡塔尔(قطر‎语逗号(,)隔绝。

struts.serve.static.browserCache=true

设置浏览器是还是不是缓存静态内容,暗中认可值为true(坐蓐情况下行使卡塔尔国,开荒阶段最棒关闭。

struts.enable.DynamicMethodInvocation = false

该属性设置Struts2是或不是协理动态方法调用,该属性的暗中同意值是false。较新本子版本推荐应用通配符

struts.devMode = false

付出格局下行使,那样可以打字与印刷出更详实的错误信息。

Struts 2 url Tag(tag即标签,以下作品或者会相互都用,都是一个情趣)

即便如此HTML为创造超链接提供了二个精简的竹签:a标签,然则a标签平时满含冗余新闻。别的,HTML标签不是非常轻易就能够动态做客框架提供的动态数据。八个分布的事例是链接到任何页面。在层层二中,大家运用 url tag在index.jsp中增添了三个链接到hello.action。有关url tag的越来越多新闻方可参照他事他说加以考察 url documentation

index.jsp

 

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Basic Struts 2 Application - Welcome</title>
  </head>
  <body>
    <h1>Welcome To Struts 2!</h1>
    <p><a href="<s:url action='hello'/>">Hello World</a></p>
  </body>
</html>

 

三个宽广的用例是,U中华VL还索要满含多少个询问字符串参数,举例userName。即使要增多八个询问字符串参数,则运用Struts2的 param标志,嵌套在url标识内。

带参数的url tag 

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Basic Struts 2 Application - Welcome</title>
  </head>
  <body>
    <h1>Welcome To Struts 2!</h1>
    <p><a href="<s:url action='hello'/>">Hello World</a></p>
    <!--url tag-->
    <s:url action="hello" var="helloLink">
      <s:param name="userName">零号芯片</s:param>
  </s:url>
  <p><a href="${helloLink}">Hello 芯片</a></p>
  </body>
</html>

下一场将url tag作为a标签的href属性值,大家将s:url tag分离到它和谐的代码块中。我们得以从地点的代码中看出,嵌套在 url tag 中的是param tag,那么些 tag允许我们钦命四个参数名name:userName,和参数值:零号集成电路。注意参数值将会被举办U大切诺基L编码,在下一个课程中,大家将探究哪些在struts第22中学访谈参数值。

瞩目url tag中var属性的运用。var属性的值是一个援用,大家可以在代码中动用它来援引创立的url,上边代码中,a标签的href即var属性值。

email

用来阐明给定的字段是或不是合乎多少个Email的行业内部。它的正则表明式为

\b(^[_A-Za-z0-9-](\.[_A-Za-z0-9-])*@([A-Za-z0-9-]) ((\.com)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)\b

<validators>
    <field name="email">
        <field-validator type="email">
            <message>请输入正确的邮箱</message>
        </field-validator>
    </field>
</validators>

2.4 全局视图 globalResults

全局视图

如下Action类,多个method都有再次回到“ar”和“br”:

public class SomeAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String doFirst() {
        if ("aaa".equals(name)) {
            return "ar";
        }
        if ("bbb".equals(name)) {
            return "br";
        }
        return "success";
    }
    public String doSecond() {
        if (age < 16) {
            return "ar";
        }
        if (age > 40) {
            return "br";
        }
        return "welcome";
    }
}

在struts.xml中不选取全局视图时,供给写过多的重复代码,使得代码痴肥,如下:

<struts>
    <package name="xxx" namespace="/test" extends="struts-default">
        <action name="first" class="com.zenghai.actions.SomeAction" method="doFirst">
            <result name="ar">/apage.jsp</result>
            <result name="br">/bpage.jsp</result>
            <result>/success.jsp</result>
        </action> 
        <action name="second" class="com.zenghai.actions.SomeAction" method="doSecond">
            <result name="ar">/apage.jsp</result>
            <result name="br">/bpage.jsp</result>
            <result name="welcome">/welcome.jsp</result>
        </action>
    </package>
<struts>

(1)包范围全局视图

  若某视图页面能够被相仿包中的多个 action 所共用,则应将其定义为包范围全局视图。包范围全局视图定义于包中,在包中是可以见到的。

<struts>
    <package name="xxx" namespace="/test" extends="struts-default">
        <!-- 包范围全局视图 -->
        <global-results>
            <result name="ar">/apage.jsp</result>
            <result name="br">/bpage.jsp</result>
        </global-results>
        <action name="first" class="com.zenghai.actions.SomeAction" method="doFirst">
            <result>/success.jsp</result>
        </action> 
        <action name="second" class="com.zenghai.actions.SomeAction" method="doSecond">
            <result name="welcome">/welcome.jsp</result>
        </action>
    </package>
</struts>

(2)应用范围全局视图

  若要使有些视图为保有包可用,即定义其为利用范围全局视图。可定义二个基本包,在基本包中定义全局视图。然后,让任何包都世袭自该基本包就能够。当然,基本包要世袭自struts-default。那时候的包不带有Action,能够标志为abstract=“true”,定义为抽象包。

<struts>
    <package name="basePackage" extends="struts-default" abstract="true">
        <global-results>
            <result name="ar">/apage.jsp</result>
            <result name="br">/bpage.jsp</result>
        </global-results>
    </package>
    <package name="xxx" namespace="/test" extends="basePackage">
        <action name="first" class="com.zenghai.actions.SomeAction" method="doFirst">
            <result>/success.jsp</result>
        </action> 
        <action name="second" class="com.zenghai.actions.SomeAction" method="doSecond">
            <result name="welcome">/welcome.jsp</result>
        </action>
    </package>
</struts>

2.5 为使用钦命三个布局文件

  在半数以上施用里,随着应用范围的加码,系统中 Action 数量也豁达日增,引致 struts.xml配置文件变得不得了庞大、肥壮。
  为了防止这种地方包车型大巴发出,进步 struts.xml 文件的可读性与可维护性,能够将叁个 struts.xml 配置文件分解成多少个布局文件,然后在 struts.xml 文件中包罗入别的配置文件。
  为 Struts2 应用内定三个 Struts2 陈设文件,能够行使<include/>。

譬如说,将上四个struts.xml的配备文件表达为多少个公文为:
struts-base.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="basePackage" extends="struts-default" abstract="true">
        <global-results>
            <result name="ar">/apage.jsp</result>
            <result name="br">/bpage.jsp</result>
        </global-results>
    </package>
</struts>

struts-action.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="xxx" namespace="/test" extends="basePackage">
        <action name="first" class="com.zenghai.actions.SomeAction" method="doFirst">
            <result>/success.jsp</result>
        </action> 
        <action name="second" class="com.zenghai.actions.SomeAction" method="doSecond">
            <result name="welcome">/welcome.jsp</result>
        </action>
    </package>
</struts>

在struts.xml中运用<include/>标签钦赐多少个布局文件

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>
    <include file="struts-base.xml"></include>
    <include file="struts-action.xml"></include>
</struts>

  常常意况下,是遵照功用模块来拆分 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>
    <include file="struts-*.xml"></include>
</struts>

平日说来七个构造文件日常都不放置在src路线下,而是放置在任何路径下,如:

乐百家前段 7

防止被爬,先贴上本帖地址:struts2 官方连串教程生龙活虎:使用struts2 标签 tag 

表单标签

广阔的表单标签在 struts2 中都有

比如: form,textfield,password,checkbox,checkboxlist ,hidden,submit,reset 等。

<s:form action="register">
    <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>
    <s:password name="password" label="密码"/>
    <s:textfield name="birthday" label="生日"/>
    <s:checkbox name="married" value="true" label="已婚"/>
    <s:checkboxlist list="{'吃饭','睡觉','写代码'}" name="hobby" label="爱好" />
    <s:select list="#{'BJ':'北京','SH':'上海','SZ':'深圳'}" label="城市" headerKey="" headerValue="---请选择城市---"/>
    <s:radio name="gender" list="#{'male':'男','female':'女'}" label="性别" value="'male'"/>
    <s:textarea label="描述" rows="5" cols="30"/>
    <s:submit value="注册" />
    <s:reset value="重置" />
</s:form>

2.1、 <package/>标签

(1) name 属性

  配置包时必需钦定 name 属性,该属性值能够私下取名,但必得唯生龙活虎。其与 Java 的类包间无对应提到。若别的包要世襲该包,则必需透过该属性举办引用。

(2) namespace 属性

  包的 namespace 属性用于定义该包的命名空间。命名空间是访谈该包下 Action 的不二法门的一片段。此属性不是必需的,不可能为空值。 但命名空间可认为“/”。

乐百家前段 8

乐百家前段 9

乐百家前段 10

乐百家前段 11

乐百家前段 12

乐百家前段 13

(3)extends 属性

  常常情形下,包要求持续 struts-default 包。因为 Struts2 的 12个重回类型、35 个拦截器、暗许拦截器栈等 Struts2 的主要性效能,都定义在此个包中。世袭了那几个包,也就具备了这么些职能。struts-default 包定义在 struts-default.xml 中。

乐百家前段 14

struts-default 包

(4)abstract 属性

  包还能通过 abstract=“true”定义为抽象包。抽象包中是无法饱含 Action 的。抽象包日常正是用来被接续的。上海教室struts-default 包即为抽象包。

 

visitor

该验证程序能够增长代码的可重用性,你能够接收它把同两个认证程序配置文件用于四个动作。

<validators>
    <field name="streetName">
        <field-validator type="requiredstring">
            <message>请输入正确街道地址</message>
        </field-validator>
    </field>
</validators>

<validators>
    <field name="address">
        <field-validator type="visitor">
            <message>Address:</message>
        </field-validator>
    </field>
</validators>

1.3、 struts-plugin.xml

Struts2 与第三方插件的三结合配置文件。
义务: Struts2 框架 lib 目录中享有以-plugin-停止的 jar 包中。

Web应用程序与金钱观网址分裂,Web应用程序能够创制动态响应。为了更有益于地援用页面上的动态数据,Struts 2框架提供了一星罗棋布标签(tag)。某些标签模仿正规的HTML标签,同期提供了一个value属性,有个别标签创制是非规范的但却极其有效。

讲授配置

应用注明前必须保障 已经导入了 struts2-convention-plugin 的包。

在 Action 类上丰盛 @ParentPackage("struts-default")
在相应的措施上加上

@Action(value = "hello", results = {
           @Result(name = "success", location="/hello.jsp")})

如下:

@ParentPackage("struts-default")
public class HelloAction extends ActionSupport {
    @Action(value = "hello", results = {
               @Result(name = "success", location="/hello.jsp")})
    public String hello() throws Exception {
        System.out.println("hello world!");
        return SUCCESS;
    }
}

布局好后,就足以经过浏览器访问(根路线决定于项目布置卡塔尔(قطر‎
http://127.0.0.1/strut2/hello.action
万朝气蓬勃访问成功,调节台后打字与印刷 hello world!

1.7、 配置文件的设置优先级

在 struts.xml、 struts.properties 与 web.xml 中均可做常量设置。当它们对相像常量举办设置后,其优先级由高到低依次为:web.xml、 struts.properties、 struts.xml
具体看Struts2入门中的Struts2的布置文件的加载顺序


在上生龙活虎节课程中,我们在index.jsp中应用 url tag 创设了三个超链接hello.action 那节大家将查究struts第22中学任何tags

interceptors

用以表明拦截器。

在 interceptors 中配置 interceptor, interceptor-stack,interceptor-ref 等评释拦截器。

1.6、 web.xml

可用以安装常量、扩张 Struts2 等,但貌似不那样使用。因为这里的常量设置在 struts.xml
中均可安装。但,若那些文件中均做了某二个设置, web.xml 中安装的优先级最高。
位置: WEB-INF 下

乐百家前段 15

image.png

为了利用struts2 tag,大家不得不首先引进五个taglib库指令 平常那几个命令是那般的:<%@ taglib prefix="s" uri="/struts-tags" %> 这样具备的struts2 tag 将会以 “s”为前缀,如若你想阅读一下 struts2 tag的TLD文件,你能够在 Struts 2 core jar里的META-INF 文件夹里找到。

UserAction

创制七个 UserAction 来处理需要,轻巧起见,使用评释形式计划。

@ParentPackage("struts-default")
public class UserAction extends ActionSupport implements ModelDriven<User>{
    private User user = new User();
    @Action(value = "login", results = {
               @Result(name = "success", location="/home.jsp")})
    public String login() throws Exception {
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        return SUCCESS;
    }
    @Override
    public User getModel() {
        return user;
    }
}

实现 ModelDriven 方法,返回 user。
下一场在实施 login 方法在此之前,ModelDriven 拦截器会给 user 设置央求提交的值。

1、Struts2 相关的两个布局文件

Struts 2 Form Tag标签

大大多Web Application都会选用多表单录入数据,struts2标签(tag)使得成立表单尤其便于,大家在index.jsp中增添如下内容,你能够参谋Form Tags Reference来打探struts2 form标签的愈来愈多详细的情况消息。

 1 <!DOCTYPE html>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
 3 <%@ taglib prefix="s" uri="/struts-tags" %>
 4 <html>
 5   <head>
 6     <meta charset="UTF-8">
 7     <title>Basic Struts 2 Application - Welcome</title>
 8   </head>
 9   <body>
10     <h1>Welcome To Struts 2!</h1>
11      <p><a href="<s:url action='hello'/>">Hello World</a></p>
12      <!--url tag-->
13     <s:url action="hello" var="helloLink">
14       <s:param name="userName">零号芯片</s:param>
15   </s:url>
16   <p><a href="${helloLink}">Hello 芯片</a></p>
17     <!-- form tag -->
18     <p>Get your own personal hello by filling out and submitting this form.</p>
19     <s:form action="hello">
20           <s:textfield name="userName" label="Your name" />
21           <s:submit value="Submit" />
22     </s:form>
23   </body>
24 </html>

text田野先生标签会创设叁个input文本框(而里面label属性会创立一个label标签),submit标签会创立一个submit提交开关,如下所示:

乐百家前段 16

来来来,看一下源码是这样子的,为了让大家能看清,特意用sublime格式化了风姿浪漫晃代码。

乐百家前段 17

行吗,那看起来是何等鬼!??一脸懵。但有一点,那么些form表单是提交给hello.action无疑的。

咱俩注意到,struts2在form标签里创制了二个table来牢固label、input、submit那多少个标签。在后头的课程中,大家将学习如何钦赐构造(table、CSS卡塔尔(英语:State of Qatar)。在下意气风发篇教程中,将介绍怎么着使用Struts 2来管理这种表单的交付。

date

用来保障给定的日期字段的值在钦命的限量内。

参数:

  • 田野先生Name:要证实的字段名
  • min:允许的细微值,满含最小值
  • max:允许的最大值,富含最大值
<validators>
    <field name="birthday">
        <field-validator type="date">
            <param name="min">2011-01-01</param>
            <param name="max">2011-12-31</param>
            <message>日期必须为2011年</message>
        </field-validator>
    </field>
</validators>

2.2、 <action/>标签

(1)name 属性

  在 struts2 中,访问 struts2 中的 action 的 U普拉多L 路线由两部份组成:包的命名空间 action的 name 属性值。举个例子访问login德姆o名字为 login 的 Action 的 UEscortL 路线为:/test/login.action。若从浏览器地址栏直接访问,其访谈 UMuranoL 地址可写为:
http://127.0.0.1:8080/loginDemo/test/login.action

(2)method 属性

  Action 标签有壹天性情 method,该属性用于内定所要实践的 Action 类的哪些 Action 方法 。若未有一点点名该属性值,则暗中认可值为“execute”,即进行钦命 Action 类的 execute 方法。

测试 1:改善 Action 中的 Action 方法名不为 execute,而又不钦定method 属性值,提交恳求,探访到错误提醒。
结论:表达暗中同意自动寻觅试行的方法名字为 execute(卡塔尔(英语:State of Qatar)。

乐百家前段 18

测试 2:在同二个 Action 类中开创七个 Action 方法,在结构文件中创设四个照望的action/>。可以看看那多少个<action/>的 class 属性相近,但 name 与 method 均差别。
结论:表明<action/>的概念粒度并不是 Action 类,而是 Action 的 method。即<action/>定义的是“Action 类 method”。

乐百家前段 19

乐百家前段 20

(3) class 属性

class 属性用于钦赐该 Action 所要实行的 Action 类。其有两种写法:

  • a、直接写要进行的类的全约束性类名。
  • b、在 SSH 中, Action 交由 Spring 容器管理,这时候 class 属性要安装为一个伪类名。
  • c、class 属性缺省。 对于 class 属性缺省气象是指,若客户提交某些央浼后,无需经过某些 Action 类的管理,而是直接要转化有个别视图页面, 如简单的页面间的超链接, 则可利用如下方式:

    乐百家前段 21

若<action/> 未有 class 属性,则私下认可施行 ActionSupport 类。 原因是在 Struts-default 包中经过<default-class-ref/>钦命了暗许履行的类。

乐百家前段 22

乐百家前段 23

ActionSupport 类有贰个 execute(卡塔尔 方法,其再次来到值为常量 SUCCESS,即字符串“success”。

乐百家前段 24

 本教材大器晚成经你已成功了HelloWorld项目,你能够 下载本章节的代码

目录

  1. 景况搭建
  2. Action
  3. 配备详细解释
  4. 通配符和动态方法调用
  5. OGNL
  6. Struts 标签
  7. Validator
  8. Interceptor
  9. 国际化
  10. 大范围例子

1.4、 struts.xml(最重要)

Struts2 大旨配置文件。是程序猿首要开展安排之处。 在 src 目录下,即 classpath 下。

field expression

用来注脚有些字段是还是不是满意三个OGNL表明式。那是贰个基于字段的认证。唯有给定的参数的重临值是true时本领注解通过。验证不经过时产生一个字段错误。

参数:

  • 田野Name:要证明的字段名
  • expression:OGNL表明式,唯有该表明式为true技巧注脚通过
<validators>
    <field name="maxNumber">
        <field-validator type="fieldexpression">
            <param name="expression">
            maxNumber>100
        </param>
        <message>最大值必须大于最小值1</message>
        </field-validator>
    </field>
</validators>

2.3 <result/>标签

(1) name 属性

  result 标签用于内定 Action 实践达成后所要转正的视图财富。其 name 属性钦定该视图的名目,假如 name 属性缺省,暗许值为字符串常量“success”。

(2) type 属性

  Struts2 中国共产党提供了 11 种视图转向类型,类型由 result 标签的 type 属性钦赐, type 属性的值在 struts-default.xml 中能够查阅到。必要在意到,在 dispatcher 后装置的 default 为 true。即,Struts第22中学默许的结果类型为dispatcher,对应Struts1中的内部须要转载

乐百家前段 25

乐百家前段 26

注意,对于央求转载的页面,能够是 WEB-INF中页面;而重定向的页面,是不能够为 WEB-INF中页的。因为重定向也正是顾客再度产生二遍呼吁,而客户是不能一贯访问WEB-INF 中财富的

乐百家前段 27

A、 dispatcher 转发

  该转会类型用于实现乞请转载效用,即服务器内跳转。诉求转载是能够将要求参数字传送递给所要转载的下一流页面包车型地铁。 dispatcher 为私下认可转向类型。

B、 redirect 跳转

  redirect 是回天无力将 Action 中的属性值传递给要中间转播的下贰个页面包车型地铁。但能够经过在 result值中应用${属性名}表明式指引参数的花样,完成将属性值向下传递的目的。表明式里的“属性名”对应 Action 类中的属性

乐百家前段 28

  该须求在拓宽重定向时,会将 username 参加乞求参数中,以 GET 形式提交央浼。该username 为 LoginAction 中的属性。若有多少个供给参数,只顾参数连接符为&而非&。

乐百家前段 29

但对于动态参数的写法, Struts2 不提出以上写法,而是提倡<param/>情势。

乐百家前段 30

只顾,其出口是从 param 参数中读取的。

乐百家前段 31

消除Struts2在重定向中文乱码难点
  乱码原因:tomcat7接纳到来自U卡宴L的用UTF-8编码后的字符串,会利用ISO8859-1進展编码(在乎tomcat8及以上版本内部选择的是UTF-8进行编码的,所以不要节外生枝卡塔尔(قطر‎,所以现身乱码。

解决方法:

  • 只对tomcat7及以下:

  以get格局提交过来的中文参数,先拿到ISO8859-1的二进制数组,再转成字符串。那样在jsp页面中,要显得客商名uname,就要换到下边第二句uname1代码:

<body>
    param.uname = ${param.uname }<br><>
    uname1 = <%=URLDecoder.decode(new String(request.getParameter("uname").getBytes("ISO-8859-1")), "UTF-8") %>
    redirect.uage = ${param.uage }<br>
  </body>

除了这几个之外,HelloWorldAction类的代码还应改进为:

public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String execute() throws Exception {
        this.name = URLEncoder.encode(getName(), "UTF-8");//不能在URL中直接传字符串,所以应该编码
        name = URLDecoder.decode(name, "utf-8");//解码,在控制台正确输出中文字符时需要
        System.out.println("name = "   name);
        System.out.println("age = "   age);
        return SUCCESS;
    }
}

C、redirectAction 跳转

  特意用来重定向到 Action。当然,Acton 中的属性值是力不能支传递到下一个Action 中的。然则请留意,redirect 在不接纳<param/>方式时,也是能够重定向到 Action 的。

Step1:定义 SecondAction类

public class SecondAction extends ActionSupport {
    private String uname;
    private int uage;
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public int getUage() {
        return uage;
    }
    public void setUage(int uage) {
        this.uage = uage;
    }
    @Override
    public String execute() throws Exception {
        System.out.println("Second uname = "   uname);
        System.out.println("Second uage = "   uage);
        return SUCCESS;
    }
}

Step2:定义 welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  <body>
    uname = ${uname }<br>
    uage = ${uage }<br>
  </body>
</html>

Step3:注意,redirctAction 的写法:

<?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="xxx" namespace="/test" extends="struts-default">
        <action name="login" class="com.zenghai.actions.LoginAction">
            <result type="redirectAction">
                <param name="actionName">second</param><!-- 不要添加请求扩展名.action -->
                <param name="uname">${name}</param>
                <param name="uage">${age}</param>
            </result>
        </action> 
        <action name="second" class="com.zenghai.actions.SecondAction">
            <result>/welcome.jsp</result>
        </action>
    </package>
</struts>

  对于重定向到 action,仍可以够使用<param/>来设定转向的 action。注意,也绝不为要跳转的 action 增多央浼扩充名。且使用<param/>方式时,不可能利用 type=”redirect”,必需运用redirectAction。
  把LoginAction的参数传递给SecondAction:

乐百家前段 32

也可转变其余包的 action,通过 namespace 参数钦点包。

乐百家前段 33

D、chain 跳转

  用于将呼吁转载到 Action。注意,当时要中间转播的 Action 央求不能够带扩大名。如本例,只可以写为 second,但无法写为 second.action。当然,request 范围的参数是能够传递到下叁个ction 中的。

乐百家前段 34

E、plainText 呈现原始文本

  plainText展现原始文件内容,比如:当我们须求原样展现jsp文件源码的时候,能够运用该品种。struts.xml配置文件配置那样三个Action:

乐百家前段 35

ValueStack

ValueStack 实际是二个接口,在 Struts2中利用OGNL时,实际上利用的是该接口落成类 OgnlValueStack。

每种 Action 类的目的实例都有贰个 ValueStack 对象,用于保存参数或结果。

在 ValueStack 对象的内部有两个逻辑部分:

  • ObjectStack: Struts 把动作和血脉相同对象压入 ObjectStack 中,看作 List 容器。
  • ContextMap: Struts 把各种各样的投射关系存入 ContextMap 中,看作 Map 容器。

Struts2 会把下部这一个目的存入 ContextMap 中

  • parameters: 该 Map 中含有当前倡议的呼吁参数
  • request: 该 Map 中饱含当前 request 对象中的全体属性
  • session: 该 Map 中带有当前 session 对象中的全数属性
  • application:该 Map 中蕴涵当前 application 对象中的全体属性
  • attr: 该 Map 按如下顺序来搜索有个别属性: request, session, application

1.5、 struts.properties

用以纠正常量的值。因为常量在 struts.xml 中也能够开展设置,所以日常不行使该文件。
该文件是技术员手工业创设的,放在在 src 目录下,即 classpath 下。 文件内容格式如下:
struts.i18n.encoding = GBK
struts.action.extension = action,do

global-results

包内全局的结果视图,包内 action 未有布置 result 时,会选取全局结果视图。日常是在根基包里面配备,比方全局的记名验证。

结构能源包

  • 全局能源包
<!--
在struts.xml 中配置常量指定全局字符串包位置
-->
<constant name="struts.custom.i18n.resources" value="com.ittianyu.i18n.strings" />
  • 包范围的财富包:把 能源包放在某包下边,命名称叫:package_语言代码_国家代码.properties
  • 有的新闻能源包:把 财富包放在某动作类路线下,命名称为:动作类名称_语言代码_国家代码.properties

财富包的应用各样:局地 > 包范围 > 全局

通配符

struts2 中 action 的 name 扶持通配符 *
用于匹配0个或多个字符。
旧版中得以一贯运用,在新版中,需求启用通配符。
在 package 开头加上

<!--动态方法配置,2.5之后额外配置允许的方法名-->
<global-allowed-methods>regex:.*</global-allowed-methods>

除此以外还足以由此 {n} 来援引 相配的值。

<action name="*_*" class="com.ittianyu.javaeetest.web.action.{2}Action" method="{1}{2}">
    <result name="success">/{1}{2}.jsp</result>
</action>

如上安排,大家采访 hello_World 时,会自动相配方法 helloWorld,并在点子试行到位后,转载到 helloWorld.jsp

constant

用来配置 struts2 中的常量。

乐百家前段,<a id="4"> </a>

向 Action 传递参数

签到是很普及的 action,这时候日常要向服务器传递 username, password 等。

本文由乐百家前段发布,转载请注明来源:【乐百家前段】Struts2的配置文件