Struts.xml 配置
HelloWorld
/example
一个package下可以配置多个action,一个action下也可以配置多个result
web.xml
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_2_5.xsd">
当未给action中的result标签启用name 时默认的为 success
package标签的功能相当于Java中的包
web应用发布时,首选经过web.xml的过滤,再到struts.xml的配置中找到相应的action
namespace:
namespace决定了action的访问路径
当namespace为空时,匹配其他namespace不匹配的情况(相当于switch中default情况)
web应用程序的访问路径:httP//localhost:端口/webapp/namespace/action
Action:具体的视图的返回可以由用户自定义action 决定
三中方式:
实现 action 的方式可以是一个普通的 java类里边必须包含一个public String execute(){}方法
可以实现action接口
也可以继承ActionSupport(通常使用这个)
当没有定义action 的class时,会调用系统默认的action 方法返回值仍旧 是“success",根据返回值确定具体的视图
路径问题:
Struts中是根据action的路径决定,不要使用相对路径,使用绝对路径
Action执行的时候并不一定要执行execute方法可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)action的name和namespace保持一致,可以实现一个action下动态的方法调用,在url中指定使用哪个方法(url中用!方法名)
使用通配符,遵循约定优于配置(约定的好,可以简化配置)
action类和视图jsp 的名称有公共部分,各个action 的名称风格统一,各个jsp的名称风格统一
接受参数:
三中方式:1.属性方法
视图页面的 url的请求参数和action中的属性名称要一致,当调用方法时,系统会自动调用setXXX方法将请求参数传递,
若果类型不匹配会自动完成类型转换,构造函数必须是空参数的
2. DomainModel(域模型)或者增加 DTO(数据传输对象)方式
域模型就是一系列的对象模型,给出一系列的对象模型,在action中创建域模型对象,同样给出set和get方法以及构造函数
在url中使用对象名.属性名=valuel进行传值,系统会自动为我们创建一个相应的对象,然后调用域模型对象的set方法,之后调用action 的set对象的方法
3.模型驱动方式
解决中文问题:
在struts中增加
简单的数据校验:
this.addFieldError("属性字段","错误信息"),可以向前台传送属性错误信息;在前台获取错误信息:
调用 struts 的标签库:<%@taglib uri="" prefix=" s"%> url指定路径,prefix指定使用标签的前缀,当错误信息在前台呈现时, struts2会使用
- 信息
Struts ValueStack Debug(值占区)内容(访问直接使用property Name):
Object Property Name Property Value
texts
对象
actionErrors []
errors {关键字=[内容1,内容2],[],[]...}
PersonAction.personAction(Action 的路径) fieldErrors {关键字=[内容1,内容2],[],[]...}
errorMessages []
locale
actionMessages []
texts
Stack Context(栈环境) 区:(访问方式:#key)<以下只列出常用的>
key value
request
action
parameters
application
attr
session
可以通过
访问web元素:
获取Map类型的request,session,application,HttpServletRequest,HttpSession,servletContext
第一种方式(可以放到构造函数中,也可以放到execute()方法中:
request=(Map)ActionContext.getContext().get("request");
session=(Map)ActionContext.getContext.getSession();
application=(Map)ActionContext.getContext().getApplication();
第二种方式(使用泛型,实现RequestAware,SessionAware,ApplicationAware接口):
private Map
private Map
private Map
//DI dependency injection
//IoC inverse of control
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setRequest(Map
this.request = request;
}
@Override
public void setSession(Map
this.session = session;
}
@Override
public void setApplication(Map
this.application = application;
}
第三种:
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
第四种(实现ServletRequestAware接口)
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
模块包含:
默认action配置:当所访问的action不存在是都提交给默认的 action