三、Action访问环节
Action 有三种书写方式
Action 有三种配置方式
1、Action三种书写方式
第一种 用户定义Action类,可以不去实现任何接口,继承任何父类
第二种 用户定义Action类,实现Struts2 提供Action接口 (更规范 Action写法 )
public static final String SUCCESS = "success"; 数据处理成功,需要返回成功页面
public static final String NONE = "none"; 数据处理成功,不想返回一个页面
public static final String ERROR = "error"; 当处理失败时,显示错误页面
public static final String INPUT = "input"; 当参数非法,校验失败,返回input页面
public static final String LOGIN = "login"; Action需要登录才能访问,跳转login页面
开发时,将以上五个值 称为逻辑视图 ,需要在struts.xml 中通过<result> 标签为每个逻辑视图,配置物理视图(真实页面文件路径)
<result name="success">/demo1/success.jsp</result>
public String execute() throws Exception;
第三种 用户定义Action类,可以继承ActionSupport 基类
validate方法 提供用于对请求参数 合法性校验
addActionError 方法 添加一个Action错误信息
addFieldError 方法 添加一个表单字段错误信息
getText方法 获得国际化配置信息
******* 实际开发中,用户定义Action类,通常继承ActionSupport 类
2、指定Action 执行哪个方法
1) 通过method属性 指定Action 调用方法 名称 (不写method 默认调用Action的execute方法)
<a href="${pageContext.request.contextPath }/addbook.action">添加图书</a> <br/>
<a href="${pageContext.request.contextPath }/updatebook.action">修改图书</a> <br/>
<action name="addbook" class="cn.itcast.struts2.demo3.BookAction" method="add"></action>
<action name="updatebook" class="cn.itcast.struts2.demo3.BookAction" method="update"></action>
结论:通过method属性,配置不同请求路径 访问同一个Action的不同方法
2) 设置统配符 * , 设置通配符 <action name="*book" class="cn.itcast.struts2.demo3.BookAction" method="{1}"></action>
3)使用动态方法调用 ,必须设置常量 struts.enable.DynamicMethodInvocation = true
在访问Action名称后 "!方法名" 进行动态方法调用
${pageContext.request.contextPath }/curd.action ------ 执行CURDAction中execute方法
${pageContext.request.contextPath }/curd!add.action ---- 执行CURDAction中 add方法
${pageContext.request.contextPath }/curd!delete.action ---- 执行CURDAction 中delete方法
3、 Action配置 默认Action和默认Class
<default-action-ref name="default"></default-action-ref> 默认Action ---- <action name=""> 没有找到匹配元素
<default-class-ref class="cn.itcast.struts2.demo5.DefaultClass"></default-class-ref> 默认处理类 找到<action name="" > 没有配置class属性
4、关于Action 的访问配置 三种方式 ---- 如何找到Action
第一种 struts.xml <action name="" class="" /> 访问name 找到class
第二种 Conversion 约定书写 无需struts.xml 无需Annotation 注解
第三种 Annotation 注解配置 Struts2 Action
--------------------------------------------------------------------------------------------------------------------------------
四 Convension 零配置
将struts2_blank下 11 jar 复制工程, 复制 struts2-convention-plugin-2.3.7.jar 总共12个
插件会自动搜索action、actions、struts、struts2包下所有Java类
1)所有实现了com.opensymphony.xwork2.Action的Java类
2)所有类名以Action结尾的Java类
<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/> 指定哪些包会被搜索,找Action
<constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/> 哪些包不会被搜索
<constant name="struts.convention.result.path" value="/WEB-INF/content/"/> 结果页面路径
下面Action 都符合 搜索要求
cn.itcast.struts2.HelloAction
cn.itcast.actions.books.BookSearchAction
cn.itcast.struts.user.UserAction
cn.itcast.estore.action.test.LoginAction
约定写法
cn.itcast.struts2.HelloAction 映射到 /hello.action
cn.itcast.actions.books.BookSearchAction 映射到 /books/book-search.action
cn.itcast.struts.user.UserAction 映射到 /user/user.action
cn.itcast.estore.action.test.LoginAction 映射到 /test/login.action
练习 : action.aaa.GetDataAction 翻译 /aaa/get-data.action
web.xml 还是需要配置的, 只要配置Filter,请求才能进入struts2 框架
结果页面,必须配置 struts.convention.result.path 所指定目录中
访问cn.itcast.struts.user.UserAction返回success
Convention优先使用 WEB-INF/content/user/user-success.jsp
如果user-success.jsp不存在,会使用user-success.html
如果user-success.html不存在,会使用user.jsp
五、安装ConfigBrowser插件,通过该插件查看Action 的加载信息
struts2-config-browser-plugin-2.3.7.jar 复制工程/WEB-INF/lib
访问 http://localhost:8080/工程名/config-browser/index.action