Struts2
1. struts2的了解
1.1 struts的优势:
自动封装参数
参数校验
结果的处理(转发|重定向)
国际化
显示等待页面表单的防止重复提交
2.struts2框架初步搭建
1. 导包
2. 书写Action类
public class HelloAction{
public String hello(){
System.out.println("hello world");
return "success";
}
}
3. 书写src/struts.xml
/index.jsp
4. 将struts2核心过滤器配置到web.xml
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
4.配置详解
struts.xml配置
/hello.jsp
struts修改常量配置
struts 配置顺序: struts.xml , struts.properties , web.xml
struts 默认常量配置位置:struts2-core-2.3.24.jar/org.apache.struts2/defautlt..properties
修改struts 常量配置 :
方式1:src/struts.xml (推荐)
方式2: 在src下创建sturts.properties
struts.il8n.encoding=UTF-8
方式3: 在项目的web.xml中
struts.i18n.encoding
UTF-8
struts常量配置
分模块开发的配置:导入其他的标准struts.xml配置文件
动态方法调用:
1.开启动态方法常量:
访问: http://localhost:8080/struts/HelloAction!find.action
- 通配符方式调用:(推荐)
使用{1} 取出第一个星号通配内容
Action的书写方式
创建POJO类,不继承任何类
实现 Action 接口
继承 ActionSupoort 类
5.结果跳转方式
- 转发
/hello.jsp
重定向: type="redirect"
-
转发到Action
Demo1Action / 重定向到Action: type="redirectAction"
6.访问servletAPI方式
-
原理
ActionContext
Map 数据中心 原生resquest HttpServletResquest 原生response HttpServletResponse 原生ServletContext ServletContext request域 Map Session域 Map application域 Map param参数 Map aattr域 Map 3个域合一 ValueStack 值栈 通过ActionContext(推荐)
//request域 --> map(struts不推荐使用原生request)
//不推荐
Map requestScope = (Map)ActionContext.get("request");
//推荐
ActionContext.getContext().put("name","requestTom");
ActionContext.getContext().getSession().put("name","sessionTom");
ActionContext.getContext().getApplication().put("name","application");
-
通过ServletActionContext(耦合度高,不推荐)
HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); HttpoServletResponse response =ServletActionContext.getResponse(); ServletContext servletContext = ServletActionContext.getServletContext();
通过实现接口方式(ServletRequestAware)
如何获得参数
Action 生命周期:每次请求创建一个新的Action实例。线程安全,可以使用成员变量接收参数
-
属性驱动
//准备与参数名相同的属性
private String name;
//自动类型转换 ,只能转换8大基本数据类型以及对应包装类
private Integer age;
//支持特定类型字符串转换为 Date,例如 yyyy-MM-dd
private Date birthday;
...各属性的get/set方法...
- 对象驱动
public class DemoAction extends ActionSupport{
//准备user对象
private User user;
.....User的get/set方法....
}
-
模型驱动
public class DemoAction extends ActionSupport implements ModelDriven
{ private User user = new User(); public User getModel(){ return user; } }
7.集合类型参数封装
- list
public class StrutsDemo extends ActionSupport{
private List list;
public List getList(){
return list;
}
public void setList(List list){
this.list = list;
}
}
-
Map
public class StrutsDemo extends ActionSupport{
private Map map;
public Map getMap(){
return map;
}
public void seMap(Map map){
this.map = map;
}
}
8.OGNL表达式
ognl:对象视图导航语言(例如${user.addr.name})。
导包(struts包已包含)
代码准备
//准备OGNLContext
//Root
User rootUser = new User("tom",18);
//Context
Map context = new HashMap();
context.put("user1",new User("jack",18));
context.put("user2",new User("rose",22));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
-
语法
-
基本取值
//取出root中user对象的name属性 String name = (String) Ognl.getValue("name",oc,oc.getRoot()); //取出context中user1对象的name属性 String name = (String) Ognl.getValue("#)
-
赋值
Ognl.getValue("name='jerry'",oc,oc.getRoot()); Ognl.getValue("#user1.name='younger'",oc,oc.getRoot());
调用方法
-
Ognl.getValue("#user1.setName('lilei')",oc,oc.getRoot());
- 调用静态方法
//Double pi = (Double) Ognl.getValue("@java.lang.Math@PI",oc,oc.getRoot());
Double pi = (Double) Ognl.getValue("@@PI",oc,oc.getRoot());
-
创建对象(List,Map)
//创建list对象 Integer size = (Integer) Ognl.getValue("{'tom','jerry','jack','rose'}.size()",oc,oc.getRoot()); String name = (String) Ognl.getValue("{'tom','jerry','jack'}[0]",oc,oc.getRoot());
OGNL与Struts结合
结合原理:OGNLContetxt ---> ValueStack 值栈
ValueStack: Root : 当前访问的Action对象
Context: ActionContext数据中心
> //ValueStack中的两部分
> CompoundRoot root;
> transient Map context;
>
> //获得值栈
> ValueStack vs = ActionContext.getContext().getValueStack();
> vs.push(u);