struts2的占位符*在action中的配置方法
转自:https://blog.csdn.net/u012546338/article/details/68946633
在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用
- <action name="*user" class="com.zzjmay.action.UserAction" method="{1}">
- //这种通配是针对的是同一个action中,响应不同的方法
- 在jsp页面中调用的时候
- <form action="loginuser.action" method="post">
- <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
- 用户名:<input type="text" name="username" id="username"><br>
- 密 码:<input type="password" name="password" id="password">
- <br>
- <input type="submit" value="提交">
- </form>
注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理:
一、struts2的工作原理
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
二、部署一个struts2项目的一般步骤
1)在Myeclipse中创建一个web项目,并将struts2需要的jar包导入进项目中,如下图
2)在项目中的web.xml中进行配置struts2的框架,在web.xml中需要包含在<filter></filter>,在该节点下可以包含<filter-name>和<filter-mapin
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <display-name></display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- </web-app>
3)编写Action类
4)创建好了Action类中要对action进行配置struts.xml,注意该配置文件的位置要在src的根目录下
5)创建jsp的文件,进行测试
三、struts.xml的配置初探
先来看看struts的基本配置的大概情况
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <package name="user" namespace="/" extends="struts-default">
- <action name="*user" class="com.zzjmay.action.VaildateAction" method="{1}">
- <result name="success">/success.jsp</result>
- <result name="input">/{1}.jsp</result>
- </action>
- </package>
- </struts>
从上面的代码中可以看出,xml中包含的再根节点下<struts></struts>下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取
在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。
四、struts.xml中的package的配置
看着前面的代码可以很清晰的看到package的属性
属性有:
1. name:逻辑上的包名
2. namespace:命名空间,用来区分同意struts下的相同action(注意是一种逻辑上的的路径)
3. extends: 继承某个配置文件
4. abstract
具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如:
<s:form action="db/login.action" method="post">
此代码说明的就是将会去调用db命名空间下的login对应的action
还需要注意的是:
<result>标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下
<result name="success">/login/error.jsp</result>
五、struts.xml中的action的配置
六、struts.xml中的result的配置
对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置
属性有:
1. name:Action类的映射名称
2. class:Action类的完整路径
3. method:默认使用的execute()方法,如果要自定义触发方法,需要使用method自定义
七、struts.xml配置过程中的注意信息
在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中<include>
struts.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <include file="struts-user.xml"></include>
- </struts>
struts-user.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <constant name="struts.ui.theme" value="simple"></constant>
- <package name="user" namespace="/ss" extends="struts-default">
- <action name="login" class="com.zzjmay.action.UserAction"
- method="execude2">
- <!--result下的路径是物理路径 -->
- <result name="success">/login/success.jsp</result>
- <result name="error">/login/error.jsp</result>
- </action>
- </package>
- <!-- 包名不能相同 -->
- <package name="user123" namespace="/db" extends="struts-default">
- <action name="login" class="com.zzjmay.action.UserAction"
- method="execude2">
- <!--result下的路径是物理路径 -->
- <result name="success">/login/error.jsp</result>
- <result name="error">/login/success.jsp</result>
- </action>
- </package>
- </struts>
一、Action的创建方法
1)实现Action接口
2)继承ActionSupport类,覆写其中的方法
3)不继承任何类都可以实现,关键是在struts.xml中进行配置
二、Action动态方法的调用
在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担
第一种方法: 在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)
第二种方法: jsp页面中指定你要调用的那个方法
<form action=”login!myfun.action”,method=”post”>
在客户端请求中进行动态的配置:映射名!方法名.action
这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置
第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)
在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用
- <action name="*user" class="com.zzjmay.action.UserAction" method="{1}">
- //这种通配是针对的是同一个action中,响应不同的方法
- 在jsp页面中调用的时候
- <form action="loginuser.action" method="post">
- <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
- 用户名:<input type="text" name="username" id="username"><br>
- 密 码:<input type="password" name="password" id="password">
- <br>
- <input type="submit" value="提交">
- </form>
注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法
通过通配符实现,不同的类响应不同的类中的方法:
|
<action name=“*_*" class="action.{1}Action" method="{2}"> <result >/{2}.jsp</result> </action> |
三、 Action的动态结果的配置
含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。
|
UserAction.Java public class UserAction extends ActionSupport { private String nextResult; ... } |
|
Struts2.xml <action name="user" class="action.UserAction"> <result>/{nextResult}</result> </action> |
四、接收用户数据(推荐使用的实现ModelDriven的接口)
在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。
实现ModelDriven接口
步骤:
u 实现用户登录功能
u 创建User.java类
Ø 声明用户登录信息
Ø 创建无参构造
u 创建Action类
Ø 实现com.opensymphony.xwork2.ModelDriven接口
Ø 声明User类对象并实例化
Ø 实现getModel ()方法,返回User类对象
u 创建JSP页面
Ø 表单元素使用”属性”设置name属性
注意:
1) 首先,action要实现ModelDriven的接口,默认实现getModel()方法
2) 要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的
3) 比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来
UserAction.java
- public class UserAction implements ModelDriven<User> {
- //要实例化
- private User user=new User();
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public String myfun() throws Exception {
- System.out.println("username="+user.getUsername());
- System.out.println("password="+user.getPassword());
- System.out.println("myfun.....");
- //用来进行处理
- if(user.getUsername().equals(user.getPassword())){
- return "success";
- }else{
- return "error";
- }
- }
- public User getModel() {
- // TODO Auto-generated method stub
- return user;
- }
- }
login.jsp
- <form action="loginuser.action" method="post">
- <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
- 用户名:<input type="text" name="username" id="username"><br>
- 密 码:<input type="password" name="password" id="password">
- <br>
- <input type="submit" value="提交">
- </form>
五、在Action中访问Servlet API
访问Servlet API的实际项目中有两种的方法访问Servlet API
1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)
- public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{
- private User user = new User();
- private Map<String, Object> requestMap;
- private Map<String, Object> sessionMap;
- private Map<String, Object> applicationMap;
- public void setApplication(Map<String, Object> applicationMap) {
- this.applicationMap=applicationMap;
- }
- public void setSession(Map<String, Object> sessionMap) {
- this.sessionMap=sessionMap;
- }
- public void setRequest(Map<String, Object> requestMap) {
- this.requestMap=requestMap;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public String myfun() throws Exception {
- System.out.println("username=" + user.getUsername());
- System.out.println("password=" + user.getPassword());
- System.out.println("myfun2.....");
- // 用来进行处理
- if (user.getUsername().equals(user.getPassword())) {
- sessionMap.put("Succ", "成功的哇2!!!");
- Bookbiz bookbiz=new Bookbiz();
- applicationMap.put("books",bookbiz.getBooks());
- return "success";
- } else {
- requestMap.put("errorMsg", "登陆失败了2");
- return "error";
- }
- }
- public User getModel() {
- // TODO Auto-generated method stub
- return user;
- }
注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象
2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象
- public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{
- private User user = new User();
- private HttpServletRequest request;
- private HttpSession session;
- private ServletContext application;
- public void setServletContext(ServletContext application) {
- this.application = application;
- }
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- ………………
注意:在实现接口中只实现了request和application的获取
在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();
struts2的占位符*在action中的配置方法的更多相关文章
- C# 利用占位符替换word中的字符串和添加图片
利用占位符替换word中的字符串和添加图片 ///<summary> /// 替换word模板文件内容,包括表格中内容 /// 调用如下:WordStr ...
- struts2:数据校验,通过Action中的validate()方法实现校验,图解
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
- 理解Struts2的Action中的setter方法是怎么工作的
接触过webwork和Struts2的同行都应该知道, 提交表单的时候,只要Action中的属性有setter 方法,这些表单数据就可以正确赋值到Action中属性里:另外对于Spring配置文件中声 ...
- MVC 发布到IIS中的配置方法
MVC 发布到IIS中的配置方法 http://msdn.microsoft.com/zh-cn/library/gg703322(v=vs.98).aspx
- struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
本文演示了JSP中获取HTTP参数的几种方式,还有action中获取HTTP参数的几种方式. 1. 创建JSP页面(testParam.jsp) <%@ page language=" ...
- Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...
- FCKEditor在jsp页面中的配置方法
大家在使用博客园或者是在网站上面发表一些东西的时候,往往会发现,输入文字的不是一个简单的文本框,而是一个类似于word的在线编辑环境.这个插件叫FCKEditor,使用这个插件要进行一定程度的配置,下 ...
- 黄聪:日租VPS中FileZilla_Server配置方法
1.关闭VPS中IIS的FTP服务 2.FileZilla_Server 监听端口 21 3.FTP客户端端口为11311(看服务商给出的)
随机推荐
- 如果你不知道这11款常见的Web应用程序框架 就说明你out了
本文推荐了11款常见的Web应用程序框架,并列出了相关的学习资料和下载文档.如果对这些项目还不熟悉,就赶紧学起来吧~ Rails Rails是Ruby on Rails的简称,是一款开源的Web应用框 ...
- Qt学习之路(tip): parent参数
这是一篇很简单的文章,仅仅是用来说明一下一个参数的作用,因此我把它写成了tip,而不是接下来的17. 程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数.这个参数通常是QO ...
- 关于Cocos2d-x中打包图集和使用方法
准备的过程 1.打开TextruePacker软件 2.把游戏中要使用的图片拖到TextruePacker里面,TextruePacker会自动帮我们排序,让所有小图变成一个大图 3.点击Publis ...
- 关于IFrame表述正确的有:()
A. 通过IFrame,网页可以嵌入其他网页内容,并可以动态更改 B. 在相同域名下,内嵌的IFrame可以获取外层网页的对象 C. 在相同域名下,外层网页脚本可以获取IFrame网页内的对象 D. ...
- 下列没有直接采用XML技术的是( )
A. UDDI B. SOAP C. AJAX D.DCOM 解答:D DCOM(分布式组件对象模型,分布式组件对象模式)是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另 ...
- 以下哪个Hibernate主键生成策略是实现主键按数值顺序递增的?
A.increment B.identity C.sequence D.native 解答:A
- JavaScript 学习笔记之最终篇
JavaScript 的学习算是最后一篇了...把JS基础已经核心的部分彻底的进行了学习... 唯一的缺陷就是自己在运用上并不是特别的熟练...今天是JS的最后一章内容了..也是JS 中最常用的内 ...
- 11个超棒的 jQuery 分步指引插件(转)
当一个网站或者一个Web应用推出新功能时,为了让用户了解你的站点(或应用)如何操作,往往都会在站点(应用)中添加一个分步指引的效果.然而这样的效果,对于不懂原生JS的同学来说,是件很头痛的事情. 下面 ...
- CentOS 6.5配置SSH免密码登录
centos 系统对权限的设置非常微妙,如果权限设置大了则ssh 拒绝,如果权限小了,则ssh 更是被拒绝(我曾经配置好久没有打通,就是因为权限过大的原因) 参考链接:http://www.linux ...
- 重载 CreateParams 方法[1]: 从一个例子开始(取消窗口最大化、最小化按钮的三种方法)
方法1: 使用 TForm 的 BorderIcons 属性 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, C ...