struts2详细总结

Posted zdfldrz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2详细总结相关的知识,希望对你有一定的参考价值。


struts2的执行过程:


 

struts2详细总结



第一部分



11_Struts2分模块开发

    对于struts2的开发模式基本都是模块式的进行,这点将在后续总结中逐步渗透!


12_Action三种编写方式

    在struts2中,action的编写共有三种方式,其中为:

- 第一种:创建普通类,这个类不继承任何类,不实现任何接口

- 第二种:创建类,实现按action接口

- 第三种:创建类,继承类ActionSupport (这是最常用的方式)


13_Action的方法访问介绍

1、有三种方式实现Action的访问

-第一种:使用Action标签的methods属性,在这个属性里面写执行的Action方法,这种方式访问时,会发现同一个Action被重复写了好多次

-第二种:使用通配符的方式

--在Action标签里面的name属性,name属性值里面写符号* 星号

--* 理解:表示匹配任意类型

--比如访问hello_add,则hello_*可以匹配到

--用这种方式时,注意页面Action的name要和Action标签里面的name属性值相同,即都是hello_*,且在Action中的method方法取值为method=“{1}”,其中“1”表示一个星号。

-第三种:动态访问实现(不常用)

2、错误查看:

-如果Action方法有返回值,在配置文件中没有配置,出现错误:

404-No result defined for action HelloAction and result 返回值名字

3、Action里面的方法有返回值,如果有返回值时,其类型必须是String

4、Action里面的方法可以没有返回值,没有返回值时候,在result标签不需要配置

-只需把方法写成void

-让返回值,返回“NONE”;


如:public String execute(){

return:NONE;

}


14、案例-基本步骤

-搭建struts2环境:

--导包

--写Action方法,继承ActionSupport()

--配置struts.xml

--web.xml中配置struts2相关的过滤器



第二部分



1、 结果页面配置

--全局结果页面

--result标签配置action方法的返回值到不同的页面中

--创建两个action,都执行默认的方法execute(),让两个action的方法都返回success,返回success之后,配置到同一个页面

--在同一个Action类中,如果多个方法的返回值相同,返回到的页面也相同,这时可以使用全局页面配置,此时:在packege标签里应写上:

<global-results>

<result name=”success”>/hello.jsp</result>

</global-results>

此时在原来对应的action里面的相同的result标签配置可以删除,注意全局结果配置作用域为一个packege

--局部结果页面

--如果既配置了全局页面,又配置了局部页面,则最终生效的是局部页面配置

--type属性值

--默认值:做转发操作,值为:dispatcher

--另一个值:做重定向先操作:值为:redirect

--上面的两个值dispatcher和redirect一般针对到页面中的配置,配置到其他的action里面

--chain:转发到action,一般不用,缓存问题

--redirectAction:重定向到action


2、在action中获取表单提交的数据

    之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap,而在struts2中,提交表单到Action,但是action中没有request对象,不能直接使用request对象获取数据,所以得获取request对象,主要有三种方式:

--使用ActionContext类获取

Map<String ,Object>getParemeters():返回一个包含所有HttpServletRequest参数信息

--因为方法不是静态方法,需要创建ActionContext类的对象

--这个ActionContext类对象不是new出来的

--static ActionContext getContext():获取当前现成的ActionContext对象

在Action中使用ActionContext获取数据:

//1 获取ActionContext对象

  ActionContext context = ActionContext.getContext();

//2 调用方法得到表单数据

//key是表单输入项name属性值,value是输入值

Map<String, Object> map = context.getParemeters();

Set<String> keys = map.keySet();

For(String key : keys){

//根据key得到value

//数组形式:因为输入项里面可能有复选框情况

Object[] obj = (Object[]) map.get(key);

System.out.println(Arrays.toString(obj));

}

--使用ServletActionContext类获取

--static HttpServletRequest  getRequest():获取web应用的HttpServletRequest对象

--static HttpServletResponse  getResponse():获取web应用的HttpServletResponse对象

--static ServletContext  getServletContext():获取web应用的对ServletContext 对象

--static PageContext  getPageContext():获取web应用的对PageContext 对象

--调用类里面的静态方法,得到request对象。

Demo2:使用ServletActionContext类获取

//1 使用ServletActionContext获取request对象

HttpServletRequest request = ServletActionContext.getRequest();

//2 调用request里面的方法得到结果

String username= request.getParameter(username);

System.out.println(username);

--使用接口注入方式(不经常用)

--让action实现接口,为了得到request对象

Demo3:使用接口注入方式

Public class Form3DemoAction extends ActionSupport implements  ServletRequestAware{

Private HttpServletRequest request;

@Override

Public void setServletRequest(HttpServletRequest  request){

    this.request = request;

}

 

Public String Execut() throws Exception{

    Request.getParameter(“username”);

    

    Retun NONE;

}

}


3、07-action操作域对象

--request、session、ServletContext域对象

--使用ServletActionContext类操作

        --操作三个域对象

//1 request域:

HttpServletRequest request = ServletActionContext.getRequest();

request.setAttribute(req,reqValue);


//2 session域

          HttpSession session = request.getSession();

          session.setAttribute(sess,sessValue)

//3 ServletContext域             

            ServletContex  context =  ServletActionContext.getServletContext();

            context.setAtribute(contextname,contextValue);


4、Struts2封装获取表单数据方式

--原始方式获取表单数据封装到实体类对象

--获取表单数据

--new一个实体类对象,并通过set方法将数据封装到实体类

--属性封装

--在action中成员变量的位置定义表对应name属性名字相同的变量

--生成该变量的set和get方法

--此时可直接得到表单数据,但是也不能直接将数据封装到实体类的对象中

--模型驱动封装

--使用模型驱动方式,可以直接把表单数据封装到实体类对象中

--实现步骤:

1>action实现接口ModelDriven

2>实现接口里面的方法getModel方法

--把创建的对象返回

3>在action里面创建实体类对象

Public class DataDemo2Action extends ActionSupport implements ModelDriven<User>{

//前提要求:表单name属性名字和实体类属性名字要一样

Private User user  = new  User();

@Override

Public User getModel(){

    Return  user;

}

}

--使用模型驱动和属性封装时注意的问题

--在一个action中,获取表单数据可以使用属性封装,也可以使用模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只会使用模型封装,而属性封装会不发挥作用。

--表达式封装(会用就可以)

--也可以把表单数据封装到实体类对象中

--第一步:在action中申明实体类

--第二步:生成实体类变量的set和get方法

--第三步:在表单输入项的name属性值里面写表达式形式

Public  class EataDemo3Action  extends ActionSupport{

//1申明实体类

Private User user;

//2 生成实体类变量里面的setget方法,即usergetset方法

 

@Override

Public  String  execute()  throws exception{

    System.out.println(user);

    Return  NONE;

}

}

 

页面

<body>

<form action=”${pageContext.request.contextPath}/data3.action”method=”post”>

    Username:<input  type=”text” name=”user.username”/>

    <br/>

    Password:<input type=text name=user.password />

    Address:<input type=text  name=user.address />

    <input type=submit value=提交/>

</form>

</body>

   --表达式封装也可以归类到属性封装中

        --表达式封装与模型驱动封装的比较

        --使用表达式封装和模型驱动封装都可以把数据封装到实体类对象中

        --不同点:

        --使用模型驱动只能把数据封装到一个实体类对象中

        --在一个action里面不能使用模型驱动把数据封装到不同实体类对象里面

        --使用表达式封装可以把数据封装到不同实体类对象里面

        --封装数据到list集合

        --封装书到List集合

        --第一步:在action里面声明List

        --第二步:生成list变量的get和set方法

        --第三步:在页面中写表达式

Public class ListAction extends actionSupport{

//1声明list

Private List<User>list;

//2 生成listgetset方法

}

 

页面

<body>

<form action=”${pageContext.request.contextPath}/list.action”method=”post”>

<!List[0]:表示list集合中的第一个user对象-->

    Username:<input  type=”text” name=”list[0].username”/>

    <br/>

    Password:<input type=text name=list[0].password />

<br/>

    Address:<input type=text  name=list[0].address />

    <br/><br/>

 

    Username:<input  type=”text” name=” list[1].username”/>

    <br/>

    Password:<input type=text name= list[1].password />

<br/>

    Address:<input type=text  name= list[1].address />

    <br/>

    <input type=submit value=提交/>

</form>

</body>

--封装数据到Map集合

--声明map集合

--生成get和set方法

--在表单输入项的name属性值里面写表达式


Public class MapAction extends actionSupport{

//1声明map集合

Private Map<String,User> map;

//2 生成listgetset方法

}

 

页面

<body>

<form action=”${pageContext.request.contextPath}/map.action”method=”post”>

<!设置keymap[key]key值可以随便设置;设置value-->

    Username:<input  type=”text” name=”map[one].username”/>

    <br/>

    Password:<input type=text name= map[one].password />

<br/>

    Address:<input type=text  name= map[one].address />

    <br/><br/>

 

    Username:<input  type=”text” name=” map[abcd].username”/>

    <br/>

    Password:<input type=text name= map[abcd].password />

<br/>

    Address:<input type=text  name= map[abcd].address />

    <br/>

    <input type=submit value=提交/>

</form>

</body>

--封装数据总结




第三部分



1、ognl概述

1.1之前web阶段,学习过EL表达式,el表倒是在jsp中获取域对象里面的值

1.2是一种功能更强大的表达式

1.2.1在struts2里面操作値栈数据

1.2.2一般把ognl在struts2操作,和struts2标签一起使用操作値栈数据

1.3ognl不是struts2的一部分,没struts2的项目也可以使用,只是经常和struts2一起使用

--使用ognl时候首先导入jar包,strts2提供jar包

2、ognl入门案例

2.1 使用ognl+struts2标签实现计算字符串长度

2.1.1支持对象方法调用。例如:objName  methodName();

2.1.1在java代码中,调用字符串length()函数;

2.2使用到struts2的标签

2.2.1使用jstl时候,除了导入jar包外,在jsp页面需要引入标签库,使用struts2标签也一样,需要引入标签库。

<%@ taglib  uri=/struts-tagsprefix=s%>

2.3使用struts2标签实现操作

Ognl . jsp页面

<body>

<!—使用ognl+struts2标签实现计算字符串长度-->

<s: property  value=”’haha.length()/>

</body>


3、值栈

3.1之前web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内存值和取值

3.2在struts2中本身提供一种存储机制,类似于域对象,是値栈,可以存值和取值

3.3 在action里面把数据放到値栈里面,在页面中获取到値栈数据

3.4 servlet和action的区别

servlet:servlet对象默认在第一次访问的时候创建,只创建一次,单实例对象

action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象


3.5値栈存储位置

1)每次访问action时候,都会创建action对象

2)在每个action对象里面都会有一个值栈对象(且只有一个)

値栈存储位置


4、获取值栈对象

4.1 获取值栈对象有多种方式

1)常用方式,使用ActionContext类里面的方法得到值栈对象


Public class UserAction extends actionSupport{

//1 获取ActionContext类的对象

ActionContext  context = ActionContext.getContext();

//2 调用方法得到值栈对象

ValueStack  stack1 = context.getValueStack();

}



5、值栈的内部结构

5.1 值栈分为两部分

5.1.1第一部分:root,结构是list集合

1)一般操作都是root里面的数据

5.1.2第二部分:context,结构map集合

5.1.3 struts2里面的标签 s:debug ,使用这个标签可以查看值栈结构和存储值

      (1)访问Action,执行action的方法,有返回值,配置返回值到jsp页面中,在jsp


页面中使用这个标签

Public class valueStackDemoAction extends actionSupport{

Public String execute() throws Exception{

    Return success;

}

}

 

Jsp页面

引入标签:

<%@page language=java contentType=text/html;charset=UTF-8 pageEncoding=UTP-8%>

<%@ tagelib uri=/struts-tags prefix=s%>

<body>

  <s:debug></s:debug>

</body>



(2)在action没有做任何操作,栈顶元素是action的引用


6、值栈的内部结构

6.1 向值栈中放数据的多种方式

6.1.1 第一种:获取值栈对象,调用值栈对象里面的set方法

6.1.2 第二种:获取值栈对象,调用值栈对象里面的push方法

6.1.3 第三种:在action定义变量,生成变量的get方法(常用)

  //第一种方式:使用值栈对象里面的set方法

Public class valueStackDemoAction extends actionSupport{

Public String execute() throws Exception{

    //1 获取值栈对象

    ActionContext cotext = ActionContext.getContext();

    ValueStack stack = context.getValueStack();

    //2 调用set方法

    Stack.set(username,username1);

Return success;

}

}

 

//第二种方式:使用值栈对象里面的push方法

Public class valueStackDemoAction extends actionSupport{

Public String execute() throws Exception{

     //1 获取值栈对象

    ActionContext cotext = ActionContext.getContext();

    ValueStack stack = context.getValueStack();

    //2 调用push方法

Stack.push(abcd);

Return success;

}

}

 

//第三种方式:在action定义变量,生成变量的get方法

Public class valueStackDemoAction extends actionSupport{

//1 定义变量

Private String name;

//2 生成get方法

Public String execute() throws Exception{

    name = abcd;

Return success;

}

}

 

 





以上是关于struts2详细总结的主要内容,如果未能解决你的问题,请参考以下文章

struts2 之 struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程

Struts2基础学习总结

Struts2学习总结

Struts2的基本流程的详细介绍

struts2总结

Struts2总结