前言

上篇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. 记录git常用操作命令

    GIT的常用操作 0.写在前面 作为一名开发者,熟悉使用 git 代码管理工具是一项必备的基本技能.git 相较 SVN 而言,其优点不言而喻.git 的功能非常强大,其包括的操作命令也非常的多,但是 ...

  2. Oracle 11g的安装详细过程

    本次采用的电脑为win10 专业版,以下为本人电脑的配置情况: 本人是第一次在win10系统上面进行oracle 11g的安装. 以下为安装步骤: 一.下载软件包 以下为各种oracle安装包的下载网 ...

  3. PyQt5实时汇率查询

    用PyQt5实现了界面,使用urllib实时抓取ip138.com网站的汇率信息. import sys import urllib import urllib.request from PyQt5. ...

  4. web中转发、重定向等问题的路径

    web中常用路径,转发,重定向,form表单action的路径 路径的写法: a.绝对路径写法:ServeltContext都必须用绝对路径."/" b.相对路径:其他情况都可以使 ...

  5. 从yum提示空间不足到根分区扩容

    记录一次安装软件的报错 --1261065212@qq.com         1.系统版本(VMware 虚拟机) [root@ansible-admin ~]# cat /etc/redhat-r ...

  6. 初识SVN-版本控制工具

    慕课网安装教程链接:http://www.imooc.com/video/1924

  7. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  8. 开源分享 Unity3d客户端与C#分布式服务端游戏框架

    很久之前,在博客园写了一篇文章,<分布式网游server的一些想法语言和平台的选择>,当时就有了用C#做网游服务端的想法.写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本, ...

  9. webservice中jaxws:server 和jaxws:endpoint的区别

    今天在学习使用spring+cxf发布webservice时遇到个问题,我原来是用 <jaxws:endpoint id="helloWorld" implementor=& ...

  10. Java面试系列之HashMap大扫盲汇总

    PS:整理的稍微有点急,不足之处,望各路道友指正,List相关可以查看前一篇随笔! HashMap的工作原理是近年来常见的Java面试题,几乎每个Java程序员都知道HashMap,都知道哪里要用Ha ...