Structs2-Action

namespace为空
action指定class,将会执行Action::execute,返回一个字符串,然后根据字符串,寻找result,实现Action接口,继承ActionSupport
namespace 没有,那么交给welcome-liist这个文件
href超级链接,--绝对路径 ,base_path <在head中设置base标签》
<base href="<%=basePath%>">
<action name="hello" class="org.com.structs.test.MyAction" method="add">
Action里面不一定需要
DMI动态方法调用
<body>
Hello Structs2<br>
<a href="<%=basePath%>myjsp!add">Hello</a> #//这样当有多个方法时候,写一个action就可以了,不用一个method指定一个action
</body>
action定义:
public class MyAction extends ActionSupport {
public String add()
{
return "lai";
}
}
<action name="myjsp" class="org.com.structs.test.MyAction">
<result name="lai">
/MyJsp.jsp
</result>
</action>
动态方法调用是,必须在stucts.xml中打开,
这个常量必须设置为true <constant name="struts.enable.DynamicMethodInvocation" value="true" /
===================
通配符匹配的
为什么不用DMI?DMI会有多个result配置出来
action name使用通配符可以使用
首先匹配最精确的

src里面配置action,而不是在Lib里面,想想就是
在structs.xml文件中指定
<package name="default" namespace="/" extends="struts-default">
<action name="*_*" class="org.com.lai.wizard.MyAction" method="{2}">
<result name="{2}">
/{1}{2}.jsp
</result>
</action>
</package>
对action进行通配符设置,{1}表示对name的第一个通配符,{2}表示匹配第二个*的通配符

=========================================
用Action数学来接收
在Action里面获取参数,在调用action:method时候,在action里面设置每个变量对应的setter方法和getter方法,可以获取传入的参数
http://laicb-pc:8080/ParamterSet/add?name=lai&age=222
public class MyAction extends ActionSupport {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
String name;
String age;
public String add()
{
System.out.println("String="+name);
System.out.println("Age="+age);
return "add";
}

}
Action里面通过设置getter和setter方法,structs会把路径里面的参数传递到action里面
getter和setter方法快速生成,getter和setter方法 sorce->genrate getter和setter
sysout ===> alt+/ 生成

========================================
通过DomainModel来接受参数信息
http://laicb-pc:8080/DomainModel/hell?user.name=lai&user.age=30
User声明name,age两个字段,设置getter和setter方法

在Action中,声明一个User user类来接收参数,那么就可以在url指定参数user.name,user.age
action将参数建立DTO(数据转换对象),然后new User(DTO)传入,创建DomainModel,然后就使用DomainModel模型了。

================
通过ModelDriven来传递参数
=======================
Action进行数据校验,检查某一个数据是否合法,在Action方法中,是返回
addFiledError在value stack里面添加了一个map,在jsp中通过filedErrors
数据校验主要是错误的呈现,没有request或者response这类可以使用,那么就直接返回ERROR
通过add方法,当校验成功的时候返回SUCCESS,错误的时候返回ERROR
public String add()
{
if(user.name.equals("lai")&&user.age.equals("123456"))
{
return SUCCESS;
}
this.addFieldError("name", "name && age is not suitable");
this.addFieldError("name", "name && age is too long");可以同时对一个名字多次添加错误信息。
return ERROR;
}

在对于的ERRORJSP视图中,通过taglib来获取所获得的字符串错误
<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" /> ---就可以取出数据了
<s:property value="errors.name[0]" />
<s:debug></s:debug>
structs.xml是这样配置的
<action name="user" class="com.lai.validate.action.MyAction">
<result name="error">
/errors.jsp
</result>
<result name="success">
/success.jsp
</result>
</action>
通过DMI方法来调用add方法user!add

====================================
访问web元素
第一种方法:
Action里面如何访问Web元素,在Action中
public class Action1 extends ActionSupport {
Map<String,Object> request;
Map<String,Object> session;
Map<String,Object> application;
public Action1()
{
request = (Map<String,Object>)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute()
{
request.put("r1","21");
session.put("s1", "v1");
application.put("d1", "l1");
return SUCCESS;
}
}
通过ActionContext可以获得上下文,获得request,session,application等,可以看到这三者是Map类型的
通过put可以往里面传入我们想要反馈到前台的东西
,前台jsp又特么如何访问Action中的request和session,application呢?
通过<s:property value="#request.r1">
<s:property value="#session.s1">
<s:property value="#application.d1"> 这些属性在debug标签里面都可以看到,这样就实现了前后台的交互了
jsp中我们还有request变量,session变量,application变量,通过getAttribute方法可以获取这些数据,同样的
<s:property value="#request.r1"/><br/>
<s:property value="#session.s1"/><br/>
<s:property value="#application.d1"/></br>
<s:debug></s:debug>
=====
java反射机制,reflection,可以获得运行时的class的属性方法等。
访问web元素第二种方法就是通过IOC inverse of control ,或者DI dependency injection来获取request,session的方式来进行
Action只要实现三个接口RequestAware接口,SessionAware,ApplicationAware接口。实现setReuest,setSession,setApplication方法就可以了。
来进行。
structs2可以获得这些数据,然后为Action是否实现了上面三种接口,通过反射机制可以知道。然后由structs来设置这些参数,一般我们只会用到session,而request和session一般不会用到。
public class Action2 extends ActionSupport implements RequestAware,
SessionAware, ApplicationAware {
Map<String,Object> request;
Map<String,Object> session;
Map<String,Object> application;
public String execute()
{
request.put("r1","21");
session.put("s1", "v1");
application.put("d1", "l1");
return SUCCESS;
}
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request = request;
}
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session = session;
}
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application = application;
}
}
依赖注入,意思是request的值依赖于别人的来注入,叫依赖注入,控制反转的意思就是本来request,session这些值都是自己主动去获取的,但是现在控制权交由structs去了,由structs来设置控制权。
======================
第三种访问webelement的方法,通过
HttpServletRequest request = ServletActionContenxt.getRequest();
HttpSession session = request.getSession();
HttpServletContext application = session.getServeletContext();
==============
第四种方法,通过实现ServletRequestAware接口,重载getServeltRequest接口来获得request,然后通过第三种方法来获得其他的。

===============
structs模块包含
<include file="login.xml"/> 把login.xml复制过来。
默认action
在action中找不到,就可以用默认action
在structs.xml中写入<default-action-ref name="index"></default-action-ref>

Structs2-Action

时间: 2024-11-05 14:53:59

Structs2-Action的相关文章

【web开发学习笔记】Structs2 Action学习笔记(一)

1.org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter准备和执行 2. <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> url-pattern约定熟成只写/*,没必要写*.action 3. <

【web开发学习笔记】Structs2 Action学习笔记(二)

action学习笔记2-有关于action method的讨论 Action执行的时候并不一定要执行execute方法,可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐) 方法一 <struts> <constant name="struts.devMode" value="true" /> <package name="user" e

【web开发学习笔记】Structs2 Action学习笔记(三)action通配符的使用

action学习笔记3-有关于通配符的讨论 使用通配符,将配置量降到最低,不过,一定要遵守"约定优于配置"的原则. 一:前端htm <前端代码html> </head> <body> <a href="<%=context %>/actions/Studentadd">添加学生</a> <a href="<%=context %>/actions/Studentdel

【web开发学习笔记】Structs2 Action学习笔记(两)

action学习笔记2-大约action method讨论 Action运行的时候并不一定要运行execute方法,能够在配置文件里配置Action的时候用method=来指定运行哪个方法 也能够在url地址中动态指定(动态方法调用DMI)(推荐) 方法一 <struts> <constant name="struts.devMode" value="true" /> <package name="user" ext

【web开发学习笔记】Structs2 Action学习笔记(一个)

1.org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter准备和运行 2. <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> url-pattern约定熟成仅仅写/*,不是必需写*.action 3. &

structs2 jsp页面参数封装成类传递到action

中途切入一个系统的维护,而我又是菜鸟. 系统要实现从前端jsp页面输入查询条件,传入后台action进行处理.根据原来的系统本身的代码大概明白是jsp里ognl表达式传参数过去,但是一直不成功.百度各种办法,找到下面方法都试过,好像都不行.找耳挠腮搞半天才发现,我ognl表达式里的值得大小写和action里的类实例名不一致,真是不能更二咯-.- 对齐了jsp里的ognl表达式和action里的类实例名后,问题解决了.把我搜到的structs2 jsp传参数到后台action的方法记录下来,抄一遍

Structs2中Action返回json到前台方法

1.传统方式JSON输出 这一点跟传统的Servlet的处理方式基本上一模一样,代码如下 01 public void doAction() throws IOException{ 02         HttpServletResponse response=ServletActionContext.getResponse(); 03         //以下代码从JSON.java中拷过来的 04         response.setContentType("text/html"

项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)

转自:http://www.verydemo.com/demo_c167_i1382.html 针对:预览文件(图片,PDF)文件来源为action中的inputStream 重点: structs2的action的配置 action的写法和结果类型 resulttype的写法 网页上实时显示   1 structs2的action的配置 首先在package的标签中加入自定义的结果类型<result-types>的名字displayResult,以及后面提到的自定义类DisplayFileR

structs2的action实现方式

Action的实现方式第一种:在web.xml中添加配置<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name

structs2源码解读(6)之解析package标签

structs2源码解读之解析package标签 上面讨论过,在创建Dispacher对象时,调用dispacher.init()方法完成初始化,在这个方法中先创建各种配置文件的解析器(ConfigurationProvider),然后循环遍历这些解析器的register()方法解析各个配置文件.  for (final ContainerProvider containerProvider : providers)         {             containerProvider