Struts2學習--配置及原理簡述

一、配置

這裏寫圖片描述

如圖所示,開發前先配好工作環境。
1. 將Structs壓縮包(自行下載後)解壓縮,將目錄 struts-2.3.20\apps\struts2-blank\WEB-INF\lib 下的jar包全部導入到項目的WEB-INF的lib目錄下。

2 WEB-INF下建立web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>

    <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>
</web-app>

3 src下建立struts.xml,並做相應的配置(配置package、action、處理結果result)

<?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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="default"  extends="struts-default">
        <action name="*" class="com.csp.servlet.LoginAction"  method="login">
            <!-- <result type="json"></result> -->
            <result >/WEB-INF/{1}.jsp</result>
        </action>
    </package>
</struts>

4.在src下寫各種Action的處理類
舉例如下

package com.csp.servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Servlet implementation class LoginAction
 */

public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    HttpServletRequest request;
    HttpServletResponse response;

    private String username;
    private String password;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public void setServletResponse(HttpServletResponse arg0) {
        // TODO Auto-generated method stub
        this.response=arg0;
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        // TODO Auto-generated method stub
        this.request=arg0;
    }

    public void login(){
        response.setContentType("text/json;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        Map<String,String> json=new HashMap<String,String>();
        if("admin".equals(username)&&"123456".equals(password)){
            json.put("message","歡迎管理員登陸");

        }else if(!"admin".equals(getUsername())&&"123456".equals(getPassword())){
            json.put("message","歡迎"+getUsername()+"登陸!");
        }else{
            json.put("message","非法登陸信息");
        }
        try {
            byte[] jsonBytes=json.toString().getBytes("utf-8");
            response.setContentLength(jsonBytes.length);
            response.getOutputStream().write(jsonBytes);
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

參考:
http://blog.csdn.net/killmice/article/details/9114331

二、原理
1. web.xml 在學習SSH之前,主要是用來配置Servlet。學習了Struts框架後,Servlet的概念被Action替代,儘管底層仍然是Servlet。web.xml主要是針對tomcat服務器而言,主要配置核心控制器,各種過濾器,項目運行的時候首先運行該配置文件。

2. struts.xml 主要是Struts框架的配置文件,用來配置Action。相當於以前的Servlet。客戶端發來的請求進行預處理,然後可以查詢struts.xml文件得到相應的處理類和處理方法,配置action的時候,method不寫,默認是execute方法。配置處理結果,說白了就是將邏輯結果映射到物理頁面

3. 是什麼讓http請求和action關聯在一起的?
返回上面看web.xml的內容,web.xml對任何請求進行過濾,通過反射,調用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,類的方法,方法的調用順序如下:
init—>doFilter—>destroy
init()中Dispatcher被初始化,加載struts2的相關配置文件,將按照順序逐一加載:default.properties,struts-default.xml,struts-plugin.xml,struts.xml,……
參考:
http://www.iteye.com/topic/829843
這個時候,struts.xml就粉墨登場,struts.xml也就和web.xml聯繫起來了。不難想到,框架中大量用到了反射技術,比如在struts.xml文件中找到了處理類,然後根據這個類名,創建對象,反射的方式調用處理方法。另一方面,也調用了get和set方法,自動的完成請求參數的傳遞,不用像以前那樣getHttpRequest().getParameter()。使用更加方便了。

發佈了34 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章