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