天天看点

SSH框架(struts2)

一.什么是struts2.

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,

Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,

是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,

这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

二.struts2入门

   *web.xml文件配置

<!-- 配置struts2过滤器 -->

<filter>

        <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

   *struts.xml核心配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!--package标签里面有name属性,表示名称,理论上可以随便写,namespace的值和action标签的name属性值构成访问路径 -->

<package name="demo" extends="struts-default" namespace="/">

<action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}">

<result name="list" //type=redirect或dispatcher 表示的重定向和转发操作,默认是转发>/jsp/customer/list.jsp</result>

</action>

</package>

</struts>

   *action创建

1.传统方法获取参数进行封装但要继承actionsupport

public class Data1Action extends ActionSupport {

@Override

public String execute() throws Exception {

//1 获取表单提交数据

HttpServletRequest request = ServletActionContext.getRequest();

String username = request.getParameter("username");

String password = request.getParameter("password");

//2 封装到实体类对象里面

User user = new User();

user.setUsername(username);

user.setPassword(password);

System.out.println(user);

return NONE;

}

}

2.用模型驱动进行封装

public class CustomerService implements Modeldriven<User>{

<!--模型驱动封装提交数据-->

private User user = new User();

  @Override

  public User getModel() {

return user;

  }

public string findAll() {

HttpServletRequest request = ServletActionContext.getrequest();

string username = request.getparameter("username")

  }

        }

三.如何存数据并在页面获取数据(要用值栈,也可以用传统的方式获得coke和session进行存储)

   *首先认识下action里面什么是值栈

1.之前学习过,比如在servlet把数据传递到页面中显示,在servlet里面把数据放到域对象里面,在jsp页面中使用el表达式获取域对象里面值

2.在struts2里面提供值栈,类似于域对象,值栈应用在struts2的action里面,在值栈中可以存值和取值

3.值栈存储位置

(1)servlet和action区别

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

&ction在访问时候,每次访问action时候都会创建一个action对象,多实例对象

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

在每个action对象里面存在一个值栈对象

4.值栈使用范围

 值栈使用在action范围的

5.栈

 栈就是存东西的时候后进先出,栈顶元素就是最上面的元素

   *值栈内部结构

1 值栈结构有两部分:

(1)root是list集合

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

(2)context是map集合

    存储对象引用Context里面key名称是固定的,request、session、application、parameters、attr

2 在struts2的标签里面有一个标签可以看到值栈内部结构

(1)<s:debug>,这个标签只是在调试时候使用,点击这个超链接看到值栈结构

(2)栈顶元素是action引用

   *如何存对象

public class UserAction extends ActionSupport {

@Override

public String execute() throws Exception {

//1 获取ActionContext对象

ActionContext context = ActionContext.getContext();

//2 ActionContext对象的方法

ValueStack stack1 = context.getValueStack();

//3 存放对象

stack.set("username", "abcdef");

//也可以用push方法

//stack.push("abcdef");

return NONE;

}

}

   *如何在页面上取对象

<s:property value="username" />

<s:property value="user.username" />

<s:property value="list[1].username" />

四.一些常用的

   *post提交中文乱码

在struts.xml里面配置<constant name="struts.i18n.encoding" value="utf-8"></constant>

   *分模块开发

<!-- 开发中可以为每个模块创建配置文件,产生很多的配置文件,最后把配置文件都引入到核心配置文件中(约束不能省略的)--> 

<include file="cn.itcast.action.CustomerAction.xml"><include>

   *全局结果页面

<global-results>

<result name="list">/jsp/customer/list.jsp</result>

</global-results>

   *自定义拦截器

1.action编写

public class CustomerAction extends MethodFilterInterceptor {

@Override

protected String doIntercept(ActionInvocation arg0) throws Exception {

if(){

return arg0.invoke();//相当于放行

}

return "login";//相当于放行

}

}

2.xml编写

<struts>

<package name="demo" extends="struts-default" namespace="/">

<!-- 声明拦截器 -->

<interceptors>

<interceptor name="loginintercept" class="cn.lk.interceptor.LoginInterceptor"></interceptor>

</interceptors>

<action name="customer_*" class="cn.lk.action.CustomerAction" method="{1}">

<!-- 使用自定义的拦截器 -->

<interceptor-ref name="loginintercept">

<!-- 配置让action里面哪个方法不进行拦截 

param标签的name属性值 固定的: excludeMethods

在param标签里面,不进行拦截的方法名称 

-->

<param name="excludeMethods">login</param>

</interceptor-ref>

<!-- 

使用自定义的拦截器特点:struts2默认拦截器不会执行了

               需要把默认的拦截器手动使用一次

-->

<interceptor-ref name="defaultStack"></interceptor-ref>

<result name="list">/jsp/customer/list.jsp</result>

<!-- 到添加页面 -->

<result name="toAddPage">/jsp/customer/add.jsp</result>

<!-- 添加之后 -->

<result name="add">/jsp/success.jsp</result>

<!-- 登录成功 -->

<result name="loginsuccess">/index.htm</result>

<result name="login">/login.jsp</result>

</action>

</package>

</struts>