热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:struts2中struts.xml配置文件详解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了struts2中struts.xml配置文件详解相关的知识,希望对你有一定的参考价值。                                

篇首语:本文由编程笔记#小编为大家整理,主要介绍了struts2中struts.xml配置文件详解相关的知识,希望对你有一定的参考价值。





                               struts.xml的常用配置
              
                






























  






























/error.jsp








/talk.jsp

http://www.sina.com





 

一个Action内包含多个请求处理方法的处理

Struts1提供了DispatchAction,从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。

处理方式主要有以下三种方式:

 

1. 1   动态方法调用:


  DMI:Dynamic Method Invocation 动态方法调用。

  动态方法调用是指:表单元素的action不直接等于某个Action的名字,而是以感叹号后加方法名来指定对应的动作名:


    


  则用户的请求将提交到名为”computeAction”的Action实例,Action实例将调用名为”add”方法来处理请求。
  当指定调用某一方法来处理请求时,就不会走默认执行处理请求的execute()方法。

  注意:要使用动态方法调用,必须设置Struts2允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation常量来完成,该常量属性的默认值是true。










 

示列:简单的一个加法和减法例子。

1. index.jsp用户在页面输入两个数字,选择相加,或者相减
   当用户点击加或减需要走同一个Action但处理请求方法不同,这里使用了js动态选择。








num1:
num2:












 

2. struts.xml配置信息,启用动态方法调用(可选)











/fruit.jsp





 

3. ComputeAction控制器的类处理请求




package com.struts;
/**
* Struts2控制器的类
* @author asus
*
*/
public class ComputeAction {
/** 属性 */
private int num1;
private int num2;
private int fruit;//结果

/** 若请求为指定操作方法默认执行execute()方法 */
public String execute(){

System.out.println("当调用其它方法就不会走这个方法!");
return "";
}

/** 执行处理加法 */
public String add(){
this.fruit=num1+num2;//加
return "fruitPage";
}

/** 执行处理减法 */
public String subtract(){
this.fruit=num1-num2;//减
return "fruitPage";
}




/** JavaBean */
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int getFruit() {
return fruit;
}
public void setFruit(int fruit) {
this.fruit = fruit;
}

}



 

4. fruit.jsp响应结果的页面




计算结果:

 

1.2Action配置method属性(示列与以上代码大多一致,只修改有变更的):

  将Action类中的每一个处理方法都定义成一个逻辑Action方法。

1. index.jsp页面









num1:
num2:












 

2. struts.xml配置信息









/fruit.jsp


/fruit.jsp





  通过action元素的method属性来指定Action执行时调用的方法。

    优点:使得以更加安全的方式来实现动态方法的调用,不让别人看到你的实现方法。
    缺点:繁琐,一个处理请求的方法要跟一个action。

  Struts2根据method属性查找方法有两种途径:


        1.查找与method属性值完全一致的方法

        2.查找doMethod形式的方法

   使用动态方法调用和method属性的区别:

    1.通过以上三个struts.xml中的配置信息例子来说,他们的共同点是都在操作同一个Action。

    2.中请求地址不同。

    3.动态方法的返回值相同,则会通过result进入一个页面。而method属性就算两个方法的返回值相同但进去不同的result,可能会进入两个不同的页面。

    由上可以分析出:
      (1)如果使用同一个Action,不同的处理请求的方法,响应使用相同的配置(result等)则使用动态方法调用。

      (2)如果使用同一个Action,不同的处理请求的方法,响应分别使用不同的配置,则使用action元素的method属性,为同一个Action配置多个名称。

      

 1.3使用通配符映射(wildcard mappings)方式(示列与以上代码大多一致,只修改有变更的):

1. index.jsp页面只改动了js部分。









num1:
num2:












 

 2.struts.xml的配置信息

  在使用method属性来实现同一个Action的不同方法处理不同的请求时,会发现,随着方法的增多,从而导致大量的Action配置,这时我们就需要通过使用通配符来解决Action配置过多的方法。

  在配置元素时,需要指定name、class、method属性。其中name属性可支持通配符,然后可以在class、method属性中使用表达式。通配符用星号 * 表示。










/fruit.jsp






 


2.默认Action:

  在浏览器输入一个不存在的Action,页面将呈现404错误,为了网站更友好,我们可以设置一个默认的Action。

  

  注意:有一部份的朋友在某个自定义的action中定义default-action-ref这个配置的时候,认为在地址栏中输入地址如http://localhost:8080/project的时候(project为项目名),如果该项目后面不输入任何名字或者输错地址,则会自动进入default-action-ref定义的action并进入对应的类方法中进行操作并根据result返回页面,但是很多人发现结果并不是这样,而不管怎样都返回进入到index.jsp页面。

     实际上这一点从原理上来讲可以理解,default-action-ref这个配置的意思是当用户在点击了没有定义的action时,如果struts没有找到用户定义的action名称,则会自动跳转到该默认定义的action中。

    个人觉得地址栏中项目后不写名称和名称不存在是两个概念。

示列:

1. struts.xml 就在通配符例子中配置上默认Action











/error.jsp




/fruit.jsp






2. index.jsp页面 这里我们把提交的url :Action地址链接,写错打断,当提交时找不到对应的Action,则会进入默认Action,进入error.jsp页面








num1:
num2:

ios\')" />










3. error.jsp 创建此页面查看效果



错误页面。!
未找到,Action实例时会默认走此页面!

 

3.处理结果

  Struts2的Action处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给浏览者。


 

3.1    配置处理结果:

  Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。

 

  Struts2通过在struts.xml文件中使用元素来配置结果。Struts2提供了两种结果。

    局部结果:将作为元素的子元素配置。

    全局结果:将作为元素的子元素配置。

在package元素中配置子元素:

    全局结果可满足一个包中多个Action共享一个结果:

    



/fruit.jsp



 

3.2.    处理结果类型:

  Struts2提供了对不同种类返回结果的支持,常见的有JSP,FreeMarker,Velocity等。

  Struts2支持的不同类型的返回结果为:(加粗为常用)

 




















































名字说明
chain用来处理Action链
dispatcher用来转向页面,通常处理JSP,这是默认的结果类型
freeMarker处理FreeMarker模板
httpHeader用来控制特殊的Http行为
redirect重定向到一个URL
redirect-action重定向到一个Action
stream向浏览器发送InputSream对象,通常用来处理文件下载
velocity处理Velocity模板
xslt处理XML/XLST模板
plaintext显示原始文件内容,例如文件源代码
tiles结合Tile使用

  另外第三方的Result类型还包括JasperReports Plugin,专门用来处理JasperReport类型的报表输出;Jfreechart Plugin;JSF Plugin。

  常用示列:

1.struts.xml















/error.jsp















skipAction
add
${num1}
${num2}




/fruit.jsp





 

 2.再创建一个SkipAction 控制器的类




package com.struts;
/**
* 测试与dispatcherAction之间的传值
* @author asus
*
*/
public class SkipAction {
/** 接收computeAction实例传过来属性 */
private int num1;
private int num2;
private int result;//结果返回给页面

public String execute(){
System.out.println("当指定要走的方法时不会走此方法");
return "success";
}

/**添加的方法 */
public String add(){
result=num1+num2;
System.out.println("走add方法!");
return "success";
}
/** Get,Set方法 */
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}

}






推荐阅读
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
author-avatar
@Cobub
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有