前言

上篇Struts博文已经讲解了Struts的开发步骤以及执行流程了…..对Struts的配置文件有了了解…..本博文继续讲解Struts在配置的时候一些值得要学习的细节

Action开发的三种方式

在第一次我们写开发步骤的时候,我们写的Action是继承着ActionSupport类的…为啥我们继承了ActionSupport类呢?下面我就会讲解到

继承ActionSupport类

我们来看一下ActionSupport干了什么:

也就是说,如果我们在Action类中需要用到Struts为我们提供的数据校验等Struts已经帮我们实现的功能,我们就继承着ActionSupport类..


实现Action接口

我们再来看看Action接口干了什么:

当然啦,ActionSuppot也继承着Action接口,所以ActionSuppot拥有Action接口的全部功能….因此,这种开发方式我们是比较少用的…


不继承任何类、不实现任何接口

开发此类的Action,它是不继承任何类、不实现任何接口的…也就是说,它就是一个普通的Java类….

  • Action类

public class PrivilegeAction { public String login() {
System.out.println("我是普通的javaAction,不继承任何的类、不实现任何的接口"); return "success";
}
}
  • 在配置文件中配置:

<struts>
<package name="privilige" extends="struts-default">
<action name="login" class="privilegeaction.PrivilegeAction" method="login">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
  • 效果:


小总结

一般我们开发Action都是直接继承着ActionSupport类的…….


通配符

为什么要学习通配符

在讲解通配符之前,我们来看一下需求…..

现在我的Action中有两个方法,处理登陆和处理注册:


public class PrivilegeAction extends ActionSupport { public String login() {
System.out.println("我是登陆"); return "success";
} public String register() {
System.out.println("我是注册");
return "success";
}
}

因此,我们就需要在struts.xml文件中配置两个action节点



    <action name="login" class="privilegeaction.PrivilegeAction" method="login">
<result name="success">/index.jsp</result>
</action> <action name="register" class="privilegeaction.PrivilegeAction" method="register">
<result name="success">/index.jsp</result>
</action>

现在我们发现:它们仅仅只有访问路径和方法的名称是不一样的….但是这却要多配置一个action节点,会造成浪费!

于是乎通配符就应运而生了…


使用通配符改造

没有通配符之前,我们是需要配置两个action的…有了通配符,我们是这样做的:


<package name="privilige" extends="struts-default"> <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action> </package>

解释一下:

  • name=privilege_*,我们用了_作为分隔符。*就是我们的通配符
  • {1},就是代表着第一个通配符

我们来看一下效果:

同理可得,当我们在地址栏访问login的时候,就会执行login的方法


Struts中路径的匹配原则

有的时候,我们可能会在package节点中指定namespace名称空间,我们在访问对应的资源名称的时候,就需要在前面加入相对应名称空间的值

比如:

名称空间的值为“/user”

<package name="privilige" extends="struts-default" namespace="/user">
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action> </package>

那么在访问资源的时候,就需要在项目名称后边加上名称空间的值:

现在就有一个很奇怪妙的事情发生了:在名称空间和资源路径的中间可添加任意的路径

但是呢,不能在名称空间之前加入不存在的路径


其实这就涉及到了Struts中路径的匹配原则,我就拿随便拿个路径来举例子http://localhost:8080/user/a/a/privilege_login

  • 首先,Struts会把请求的资源路径拿到,也就是privilege_login
  • 然后在看看有没有/user/a/a这个名称空间;如果有,就返回结果
  • 如果没有,就看看有没有/user/a这个名称空间;如果有,就返回结果
  • 如果没有,再看看有没有/user这个名称空间;如果有,就返回结果
  • 直到最后,如果都没有找到,就报错!

看完这个例子,我们就可以知道为啥在名称空间和资源路径的中间可添加任意的路径,而不能在名称空间之前加入不存在的路径….这就是Struts的路径匹配原则..


Struts常量

Struts2默认的访问后缀是.action……

修改默认访问路径

有的时候,可能根据项目的需要…我想后缀名默认并不是.action,那我该怎么办呢??

我们在jar包上找到它的配置文件…

我们发现它的默认值是action,,

值得注意的是:两个逗号并不是多余的

我们不可能是直接修改jar包中的配置文件的,在struts.xml文件中提供了constant节点供我们修改struts的常量

前面已经说了,两个逗号并不是多余的。那么直接在配置文件中配置action时,会怎么样:

<constant name="struts.action.extension" value="action"/>

也就是说,“,”号能够匹配空格键

举例子说明:

  • 如果配置后缀为action。那么后缀一定要写action
  • 如果配置后缀为action,do,。那么后缀可以是action,可以是do,也可以不写
  • 如果配置后缀为action,,。那么后缀可以是action,可以不写

Struts常用的常量


<struts> <!-- 0. 请求数据编码 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 1. 修改Struts默认的访问后缀 -->
<constant name="struts.action.extension" value="action,do,"></constant>
<!-- 2. 修改xml自动重新加载 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 3. 开启动态方法调用 (默认不开启)-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 4. 修改上传文件的最大大小为30M -->
<constant name="struts.multipart.maxSize" value="31457280"/> </struts>

上面的感觉需要讲解的就只有动态方法调用了……

那动态方法调用是怎么回事呢???这是样的:在action节点不配置method属性,在地址栏使用资源名称!方法名的方式去调用业务方法


跳转全局视图

为什么需要跳转全局视图?

首先,我们还是来看一个需求:现在我有两个Action,PrivilegeAction和CategoryAction

  • PrivilegeAction

public class PrivilegeAction extends ActionSupport { public String login() {
System.out.println("我是登陆"); return "success";
} public String register() {
System.out.println("我是注册");
return "success";
}
}
  • CategoryAction


public class CategoryAction extends ActionSupport {

    public String add() {
System.out.println("我是添加"); return "success";
} public String find() {
System.out.println("我是查找");
return "success";
}
}
  • 在struts.xml文件中配置

<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
<result name="success">/index.jsp</result>
</action> <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
<result name="success">/index.jsp</result>
</action>

我们发现一个问题,只要是方法返回值是success,那么就跳转到首页….如果有大量Action方法返回的都是success,那么就要写很多很多个result节点了..

使用跳转全局视图

  • 代码就可以变成是这样子了,注意:global-results节点需要在action节点的上面

<package name="privilige" extends="struts-default" > <global-results>
<result name="success">/index.jsp</result>
</global-results> <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
</action> <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
</action> </package>
  • 效果:


Action节点中的默认配置

一份相对完整的action节点是这样子的:

        <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
</action>

method

如果我们不写method的话,默认执行的是execute()方法,execute()方法默认返回值是SUCCESS


public class BBAtion extends ActionSupport { @Override
public String execute() throws Exception {
System.out.println("我是execute()"); return SUCCESS;
}
}


class

如果不写class,class默认执行的action在struts-default有配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

什么时候会不写class?就是需要跳转到WEB-INF目录下的资源的时候…..这就类似与Servlet需要跳转到WEB-INF下的资源。【Tomcat不允许直接访问WEB-INF资源】


<!-- 什么情况不配置class? 即处理的aciton -->
<!-- 答案: 当只是需要跳转到WEB-INF下资源的时候。 -->
<action name="test2">
<result name="success" >/WEB-INF/index.jsp</result>
</action>

Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】的更多相关文章

  1. SSH框架之Struts2第三篇

    1.3相关知识点 : 1.3.1 OGNL的表达式 : 1.3.1.1 什么是OGNL OGNL是Object-Graph Navigation Language的编写,它是一种功能强大的表达式语言, ...

  2. Struts2之初识篇(一)——与struts的区别和基本配置

    Struts2资源下载地址: Struts官方地址:http://struts.apache.org/ 我这里下载了struts2的最新版本struts2-2.5.10.1-all.所有内容如下图: ...

  3. Struts2第四篇【请求数据自动封装、Action得到域对象】

    前言 前三篇的Struts博文基本把Struts的配置信息讲解完了-..本博文主要讲解Struts对数据的处理 一般地,我们使用Servlet的时候都是分为几个步骤的: 得到web层的数据.封装数据 ...

  4. 第三篇——Struts2的动态方法调用

    Struts2动态方法调用 默认方式:默认执行方法中的execute方法,若指定类中没有该方法,默认返回success: method方式:执行method属性中定义的方法,没有该方法,页面报错: 通 ...

  5. Struts2学习三----------Action搜索顺序

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2的Action的搜索顺序 http://localhost:8080/path1/path2/student.action 1)判断pa ...

  6. SSH开发模式——Struts2(第三小节)

    struts2框架的知识点,虽然分了几个小节,感觉内容还是挺多的,但是你仅仅是入门了而已,想要进一步地提升自己,你得有一颗持之以恒的学习的心,最后的内容我都将在这篇博客中讲到,所以篇幅可能会有点长,希 ...

  7. Action中动态方法的调用 Action中通配符的使用 Result的配置

       Action中动态方法的调用 动态方法调用(Dynamic Method Invocation,DMI) 标识符:! 一.通过以下选中的文件来查看是否禁止调用动态方法

  8. SSH框架之Spring+Struts2+Hibernate整合篇

    回顾 -Hibernate框架 ORM: 对象关系映射.把数据库表和JavaBean通过映射的配置文件映射起来, 操作JavaBean对象,通过映射的配置文件生成SQL语句,自动执行.操作数据库. 1 ...

  9. Struts2第六篇【文件上传和下载】

    前言 在讲解开山篇的时候就已经说了,Struts2框架封装了文件上传的功能--..本博文主要讲解怎么使用Struts框架来完成文件上传和下载 回顾以前的文件上传 首先,我们先来回顾一下以前,我们在we ...

随机推荐

  1. Django编写RESTful API(一):序列化

    欢迎访问我的个人网站:www.comingnext.cn 关于RESTful API 现在,在开发的过程中,我们经常会听到前后端分离这个技术名词,顾名思义,就是前台的开发和后台的开发分离开.这个技术方 ...

  2. Flow-Guided Feature Aggregation for Video Object Detection论文笔记

    摘要 目前检测的准确率受物体视频中变化的影响,如运动模糊,镜头失焦等.现有工作是想要在框的级别上寻找时序信息,但这样的方法通常不能端到端训练.我们提出了flow-guided feature aggr ...

  3. MYSQL创建数据库时候直接指定编码和排序规则

    安装我 在网上搜索的结果执行 代码: sudo gedit /etc/mysql/my.cnf 设置了默认编码为 UTF8 代码: [client]port            = 3306sock ...

  4. 鸟瞰spring

    一.spring框架概述: Spring框架主要提供了Ioc容器.AOP.数据访问.Web开发.消息.测试等相关技术的支持. 1.Spring的模块 1)核心容器 Spring-Core:核心工具类, ...

  5. .NET Core+Selenium+Github+Travis CI => SiteHistory

    前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory,感觉挺好(每次都这样). 想知道YouTube今天的首页长啥样么?点此查看 想知道You ...

  6. CSS3笔记之第一天

    通过展示实例来初步学习CSS3 1.背景 设置背景色:background-color:#b0c4de; 设置背景图片:background-image:url('paper.gif'); 设置背景图 ...

  7. [2017-08-28]Abp系列——业务异常与错误码设计及提示语的本地化

    本系列目录:Abp介绍和经验分享-目录 前言 ABP中有个异常UserFriendlyException经常被使用,但是它所在的命名空间是Abp.UI,总觉得和展现层联系过于紧密,在AppServic ...

  8. Ubuntu部署可视化爬虫Portia2.0环境

    部署portia环境官方文档给出的方法太过简单,对于初学者来说是很难根据那一两行字成功部署portia环境的.对于部署portia这只可爱的爬虫的过程还是有很多坑的,主要写一篇portia2.0版本的 ...

  9. ios 初体验<真机调试>

    1.很多小伙伴,初学ios后面,都想迫不及待的连接上真机,在真机上调试,本人今天花了许久时间,在网上查了许多资料,一直出现了个问题导致我没法真机调试, 问题一:Your session has exp ...

  10. Java IO包装流如何关闭

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt381 问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自 ...