struts2 笔记

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. 通配符方式调用:(推荐)
    使用{1} 取出第一个星号通配内容

Action的书写方式

  1. 创建POJO类,不继承任何类

  2. 实现 Action 接口

  3. 继承 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);

你可能感兴趣的:(struts2 笔记)