天天看點

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>