小整理:Struts2-深入学习篇
来源:互联网 发布:ipv6 直播软件 编辑:程序博客网 时间:2024/05/23 21:06
一、Struts2核心文件
1、struts.properties文件struts2常量定义
#更改struts2后缀struts.action.extension=do#让struts2支持动态方法调用<default-action-ref name="index"/><constant name="struts.enable.Dynam icMethodInvocation" value="true"/>#是否开启开发模式 struts.devMode=true#所有匹配*.action的请求都由struts2处理struts.action.extension=do#struts配置文件改动后,是否重新加载 struts.configuration.xml.reload=true#请求参数的编码方式struts.i18n.encoding=UTF-8#每次HTTP请求系统都重新加载资源文件,有助于开发struts.i18n.reload=true#文件上传最大值struts.multipart.maxSize=102400#设置上传文件临时目录 set place to fileupload of tempfile struts.multipart.saveDir=d:/temp#让struts2支持动态方法调用struts.enable.DynamicMethodInvocation=true#允许标签中使用表达式语法struts.tag.altSyntax=true
2、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> <package name="packageName" namespace="/test" extends="struts-default"><action name="actionName" class="com.ittx.struts.action.UserAction" method="methodName"><result>/sucess.jsp</result><result name="ADD">/result.jsp</result></action> </package></struts>
name:package名称
extends: 继承的父package名称
namespace: 定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为 :http://localhost:8080/struts2/test/actionName.action
2>action标签 定义访问的action名称,类,方法及返回jsp等模板页
name: action名称
class: action类
method: 方法名
3>result标签 指定响应类型和响应页面
struts.xml文件详细示例:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" ><struts> <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 --> <include file="struts-default.xml"></include> <!-- package提供了将多个Action组织为一个模块的方式 package的名字必须是唯一的, package可以扩展 当一个package扩展自 另一个package时该package会在本身配置的基础上加入扩展的package 的配置 父package必须在子package前配置 name:package名称 extends: 继承的父package名称 abstract: 设置package的属性为抽象的 抽象的package不能定义action 值true:false namespace: 定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action --> <package name="com.kay.struts2" extends="struts-default" namespace="/test"> <interceptors> <!-- 定义拦截器 name:拦截器名称 class:拦截器类路径 --> <interceptor name="timer" class="com.kay.timer"></interceptor> <interceptor name="logger" class="com.kay.logger"></interceptor> <!-- 定义拦截器栈 --> <interceptor-stack name="mystack"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="logger"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 定义默认的拦截器 每个Action都会自动引用 如果Action中引用了其它的拦截器 默认的拦截器将无效 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局results配置 --> <global-results> <result name="input">/error.jsp</result> </global-results> <!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同) name:action名称 class: 对应的类的路径 method: 调用Action中的方法名 --> <action name="hello" class="com.kay.struts2.Action.LoginAction"> <!-- 引用拦截器 name:拦截器名称或拦截器栈名称 --> <interceptor-ref name="timer"></interceptor-ref> <!-- 节点配置 name : result名称 和Action中返回的值相同 type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher --> <result name="success" type="dispatcher">/talk.jsp</result> <!-- 参数设置 name:对应Action中的get/set方法 --> <param name="url">http://www.sina.com</param> </action> </package></struts>
二、Action搜索顺序
新建一个Struts2项目,命名为Struts2。按照如下XML文件配置一个Action。
<package name="hello" namespace="/test" extends="struts-default"> <action name="helloworld" class="com.ittx.struts.action.HelloWorldAction" method="execute"> <result name="success">/hello.jsp</result> </action></package>
将应用部署,访问如下路径:http://localhost:8080/struts2/test/sdf/dsf/32/d/helloworld.action 依然可以访问到Action。
这主要是因为Struts2对Action名称的搜索是按照一定顺序进行的。以上面的情况为例:
1.struts2首先搜索命名空间为/test/sdf/dsf/32/d的包是否存在,存在的情况下,是否有helloworld这个Action;
2.搜索命名空间为/test/sdf/dsf/32的包是否存在,存在的情况下,是否有helloworld这个Action;
3.搜索命名空间为/test/sdf/dsf的包是否存在,存在的情况下,是否有helloworld这个Action;
4.搜索命名空间为/test/sdf的包是否存在,存在的情况下,是否有helloworld这个Action;
5.搜索命名空间为/test的包是否存在。在这种情况下能够搜索到,因此,可以访问到helloworld这个Action。
此外,如果按照这种搜索顺序搜索,发现所有的包均不存在,那么struts2则会到命名空间为””(默认命名空间)的包下面去找helloworld这个Action。
三、动态方法调用
动态方法调用指的就是为了解决一个Action对应多个请求的处理,以免Action太多。
动态方法调用有3中方法,分别为:
1、Action的method属性
2、感叹号方式 !
3、通配符方式
下面将分别进行介绍。
第一种:Action的method属性完成动态方法调用
只需要改两个地方,第一个是在Action类中添加其他的方法。例如:在本例中就是添加了add()和update()方法。
public class UserAction extends ActionSupport {public String add() {log.debug("执行add添加用户操作 >>>>>>");return "ADD";}public String update(){log.debug("执行update用户操作 >>>>>>");return "UPDATE";}<action name="userAdd" class="com.ittx.strutsproject.action.UserAction"method="add"><result name="ADD">/add_student.jsp</result></action><action name="userUpdate" class="com.ittx.strutsproject.action.UserAction"method="update"><result name="UPDATE">/update_student.jsp</result></action>
访问添加方法执行如下路径:http://localhost:8080/struts2/userAdd.action访问修改方法执行如下路径http://localhost:8080/struts2/userUpdate.action
第二种:感叹号方式 !这种使用method属性的方式来实现动态方法有一个不好的地方在于:如果只有几个方法需要被调用,这样还好,我们只需要在struts.xml文件中,写几个类似下面的代码段。但是,如果有几百个方法需要被动态调用,那么用这种方法可能就不适合了,这样代码冗余太大,也不便于管理。因此就有了下面的两种方法:!、通配符的使用,这里介绍第一种。
<action name="user" class="com.ittx.strutsproject.action.UserAction"><result>/sucess.jsp</result><result name="ADD">/add_student.jsp</result><result name="UPDATE">/update_student.jsp</result></action>
访问添加方法执行如下路径:http://localhost:8080/struts2/user!add.action 访问修改方法执行如下路径http://localhost:8080/struts2/user!update.action
在struts.xml文件中最下面一行代码特别要注意:这是开启感叹号可应用于动态方法调用。<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>适配struts2.5感叹号通配符调用无效的问题:在pakcage标签下添加如下标签<global-allowed-methods>regex:.*</global-allowed-methods>
第三种:通配符方式<package name="student" namespace="/student" extends="struts-default"><!-- 解决struts2.5 通配符调用无效的问题 --><global-allowed-methods>regex:.*</global-allowed-methods><action name="user_*" class="com.ittx.strutsproject.action.UserAction" method="{1}"><result>/sucess.jsp</result><result name="ADD">/add_student.jsp</result><result name="UPDATE">/update_student.jsp</result></action></package>
访问添加方法执行如下路径:http://localhost:8080/struts2/user_add.action访问修改方法执行如下路径http://localhost:8080/struts2/user_update.action
四、Struts2接受参数的几种形式
1. 用Action的属性
相应提交方式可以用get 和post,如:testAction? name=admin
如:
jsp页面:
<form action="./user_add.do" method="post"> 姓名:<input type="text" name="username"/><br> 密码:<input type="text" name="password"/><br> <input type="submit" value="提交"/><br></form>
java代码:
public class TestAction extends ActionSupport{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2. 使用DomainModel
jsp页面:
<form action="./user_add.do" method="post"> 姓名:<input type="text" name="user.username"/><br> 密码:<input type="text" name="user.password"/><br> <input type="submit" value="提交"/><br></form>
public class TestAction extends ActionSupport{//错误的写法,不能自己实例化,struts会自动实例化private Users users = new Users();private Users users;public Users getUsers(){ return users;}public void setUsers(Users users){ this.users=users;}
public class User{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
3.使用ModelDriven:
在创建Action 的时候,Action 实现了ModelDriven 接口,去调用接口的getModel()方法,取到了相关对象。jsp页面:
<form action="./user_add.do" method="post"> 姓名:<input type="text" name="username"/><br> 密码:<input type="text" name="password"/><br> <input type="submit" value="提交"/><br></form>
java代码:
public class sysAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); //手动实例化 public User getModel() { return user; //返回实例 } }
- 小整理:Struts2-深入学习篇
- Struts2 小知识点整理
- 深入学习Struts2
- 深入学习Struts2
- Struts2 深入学习(待续)
- 深入学习struts2
- 深入学习Struts2
- 深入Struts2学习(一)
- struts2学习 cookie整理
- Struts2学习整理总结
- Struts2学习小抄
- struts2学习小问题解决
- 学习小程序整理
- Struts2深入学习------OGNL
- 深入学习struts2的配置文件
- 深入Struts2学习(二)
- 深入Struts2学习(三)
- 深入Struts2学习(四)
- C#获取SQLServer数据库表名和字段名
- jQuery验证文本框内容不为空
- no entry for pthread_cond_wait
- StringBuffer与StringBuilder之间的区别
- 提升tomcat服务器性能的七条经验
- 小整理:Struts2-深入学习篇
- Makefile 中:= ?= += =的区别
- C++--类模板中的static关键字
- jsp中文乱码问题(get和post)
- 微信小程序 1 月 9 日正式发布!张小龙解答了 10 大疑问
- PL/SQL--复杂数据类型
- 第六章 Read-Write Lock(适合读取比写入次数频繁的时候)
- 大数据时代邮件服务器如何满足发展所需
- 希尔排序