1. 程式人生 > >Java之struts2框架基礎知識

Java之struts2框架基礎知識

struts2

struts2的寫法

Action類

public class HelloAction {
    public String hello() {
        System.out.println("Hello Struts!");
        return "success";
    }
}

配置 struts.xml

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

<!-- 在struts核心包的dtd檔案裡找 -->
<!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網址前的一個網址部分) extends 繼承一個包 struts-default 預設配置 預設提供的功能 --> <!-- action name 是你這個類的訪問的路徑 class 類的全限定類名 method 類方法被訪問的方法 result name 方法的返回值(匹配) type 請求跳轉的方式 預設請求轉發dispatcher 值部分:跳轉網站資源 -->
<struts> <package name="hello" namespace="/hello" extends="struts-default"> <action name="HelloAction" class="com.lanou3g.hello.HelloAction" method="hello"> <result name="success" type="dispatcher">/hello.jsp</result> </action> </package
>
<!-- 引入其他struts配置檔案 --> <include file="com/lanou3g/def/struts.xml"></include> <include file="com/lanou3g/dynamic/struts.xml"></include> <include file="com/lanou3g/dynamic/struts.xml"></include> <include file="com/lanou3g/test/struts.xml"></include> </struts>

配置struts2的核心過濾器

在web.xml中配置:
  <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>

使用快捷鍵(command + shift + t)搜尋StrutsP

struts2執行流程

localhost:8080/sh-struts2-01/hello/HelloAction
1.通過網址請求中的hello
2.找到對應的名稱空間(網址)
3.找到後 再通過網址中的HelloAction去匹配Action標籤中的name
4.匹配上,用class標籤建立其類的物件
5.呼叫該類中的方法
6.拿到類中的方法的返回值去匹配result標籤的name
7.返回值匹配上,就呼叫標籤中的頁面

struts架構圖

struts架構圖

常量配置修改

指定Web應用的預設編碼集

<!-- name:鍵值 value:值 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>

指定需要Struts2處理的請求字尾

    <!-- 
        action,,    
        表示訪問路徑的字尾名,可以是.action或者無後綴
    -->
<constant name="struts.action.extension" value="action,,"></constant>

給配置檔案提供熱載入(更改完了不用重啟伺服器)

<!--預設為false struts.devMode = false -->
<constant name="struts.devMode" value="true"></constant>

這些常量配置都可以去default.properties檔案找到你要修改的配置

動態方法呼叫

Action類

public class Demo02Action {
    public String add() {
        System.out.println("增加");
        return "success";
    }
    public String delete() {
        System.out.println("刪除");
        return "success";
    }
    public String update() {
        System.out.println("修改");
        return "success";
    }
    public String find() {
        System.out.println("查詢");
        return "success";
    }
}

配置struts.xml

<struts>
    <!-- 常量配置 動態方法 (不常用 搜尋引擎抓取不好 網址過於複雜)  -->
    <!-- struts.enable.DynamicMethodInvocation = false -->
    <!-- 預設 動態方法是關閉的 -->
    <!-- 使用 !方法名 http://localhost:8080/sh-struts2-01/dynamic/Demo02Action!delete-->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>

    <package name="dynamic" namespace="/dynamic" extends="struts-default">
        <!-- 
            使用萬用字元配置訪問路徑,星號是方法名
            method 標籤中填{1} 代表取到前面的星獲取的方法名
            http://localhost:8080/sh-struts2-01/dynamic/Demo02Action_delete
        -->
        <action name="Demo02Action_*" class="com.lanou3g.dynamic.Demo02Action" method="{1}">
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

Action類的建立方式

建立方式一

public class Demo03Action {

}
隨便一個普通類都可以作為一個Action類
只需要你去配置struts.xml檔案
相比於servlet減少程式碼的侵入性

建立方式二

public class Demo04Action implements Action {

    @Override
    public String execute() throws Exception {
        return null;
    }

}
實現Action介面
意義在於提醒你Action類中的方法該怎麼寫

建立方式三(常用方式)

public class Demo05Action extends ActionSupport{

}
因為該類實現了很多介面,一個介面就有一個功能

Action標籤的預設值

Action類

public class Demo06Action {
    public String execute() {
        System.out.println("測試 action標籤的預設值");
        return "success";
    }
}

struts.xml

<struts>
    <!-- 
        預設使用的類ActionSupport類
        (如果你這個類找不到 就去struts-default檔案下 找預設的類)
        預設的執行方法 execute()
        預設接收返回值 "success"
        預設的跳轉方式 請求轉發
    -->
    <package name="test" namespace="/test" extends="struts-default">
        <action name="Demo06Action">
            <result>/hello.jsp</result>
        </action>
    </package>
</struts>

使用struts2實現篩選

CustomerAction類

public class CustomerAction extends ActionSupport{
    public String findByName() {
        // 獲取引數
        HttpServletRequest request = ServletActionContext.getRequest();
        String string = request.getParameter("cust_name");


        if (StringUtils.isNotBlank(string)) {
            // 建立離線物件
            DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
            // 新增查詢條件
            criteria.add(Restrictions.like("cust_name", "%"+string+"%"));

            // 呼叫service方法
            CustomerService service = new CustomerServiceImpl();
            List<Customer> list = service.find(criteria);
            // 存域
            request.setAttribute("list", list);
        }       
        return "success";
    }
}

配置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="web" namespace="/" extends="struts-default">
        <action name="CustomerAction" class="com.lanou3g.web.CustomerAction" method="findByName">
            <result name="success">/jsp/customer/list.jsp</result>
        </action>
    </package>
</struts>

web.xml 配置核心過濾器

<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>/CustomerAction</url-pattern>
</filter-mapping>

service層

    public List<Customer> find(DetachedCriteria criteria) {
        // 開啟事務
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();   
        // 呼叫dao層方法
        CustomerDao dao = new CustomerDaoImpl();
        List<Customer> list = dao.find(criteria);
        // 提交事務
        transaction.commit();
        return list;
    }

dao層

    public List<Customer> find(DetachedCriteria criteria) {
        <!--獲取當前session-->
        Session session = HibernateUtils.getCurrentSession();
        <!--組裝離線查詢物件(賦值session)-->
        Criteria c = criteria.getExecutableCriteria(session);
        <!--獲取查詢結果 並返回-->
        List<Customer> list = c.list();
        return list;
    }