顯示具有 Struts2 標籤的文章。 顯示所有文章
顯示具有 Struts2 標籤的文章。 顯示所有文章

2017年2月19日 星期日

JAVA-Struts2 入門初體驗 ( 四 )__參數傳遞__Jsp to Action

在上述幾篇講到有關如何建置 Strut2 的專案
此篇會提到要如何 收 / 送 資料

我們先來講要如何把頁面資料送至後端處理,方法:
1 . 用網頁標籤內的 name 來對應到 Action 內的 Value ( get / set )
2 . 用網頁標籤內的 name 來對應到 Action 內的 Bean  ( get / set )
3 . 用網頁的表單方式統捆起來後 Action 實作 Module( form get/set )

簡單分析以上幾種方法
1 . 如果用第一種,之後 Action 一定看起來凌亂不堪,但初學好入手。
2 . 第二與第三差別在於頁面宣告的長度

以下我們就針對以上方法寫下範例:
1 . 用一般參數 set/get
仔細看 Action 部分,如果只有兩個參數還好,如果是十幾個?
整體偏程式碼都被 set /get 塞爆了
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- 皆可使用,二選一
    <form action="hello" method="post" name="form">
        姓名: <input type="text" name="userName" /><br/>
        電話: <input type="text" name="userPhone" /><br/> 
        <input type="submit" value="提交"/><br/> 
    </form>
     -->
    <!-- struts 標籤 </form>
    <form action="hello" method="post" name="form">
        姓名: <s:textfield name="userName"/><br/>
        電話: <s:textfield name="userPhone"/><br/>
        <s:submit value="提交"/> <br/> 
    </form>
    
</body>
</html>

Action.java
說明:Jsp 的標籤名稱對應在 Action 內,並且設置 Set / Get
package com.brian.example.action;

public class HelloAction {
    private String userName;
    private String userPhone;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    .( userPhone set/get )
    .
    .
    .

    public String execute() {
        System.out.println(getUserName() + "," + getUserPhone());
        return "success";
    }

}


2 . 用 Bean 來
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    
    <form action="hello" method="post">
        姓名: <s:textfield name="user.userName"/><br/>
        電話: <s:textfield name="user.userPhone"/><br/>
        <s:submit value="提交"/> <br/> 
    </form>
    
</body>
</html>

User.java
說明:
package com.brian.example.action;

public class User {
    private String userName;
    private String userPhone;
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    public String getUserPhone() {
        return userPhone;
    }
    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }
    
}

Action.java
說明:
package com.brian.example.action;

public class HelloAction {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String execute() {
        try {
            if(user.getUserName() != null || user.getUserPhone() != null) {
                System.out.println(user.getUserName() + " : " + user.getUserPhone() );
            }
        } catch (Exception e ) {
            System.out.println(e.toString());
        }
        
        return "success";
    }

}


3 . Module
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    
    <form action="hello" method="post" name="user">
        姓名: <s:textfield name="userName"/><br/>
        電話: <s:textfield name="userPhone"/><br/>
        <s:submit value="提交"/> <br/> 
    </form>
    
</body>
</html>

User
同上方法 User.java

Action
package com.brian.example.action;

import com.opensymphony.xwork2.ModelDriven;

public class HelloAction implements ModelDriven<User> {

    private User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public User getModel() {

        return user;
    }

    public String execute() {
        try {
            if (user.getUserName() != null || user.getUserPhone() != null) {
                System.out.println(user.getUserName() + " : " + user.getUserPhone());
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return "success";
    }

}



參考資料:Struts2的三种传值方式比较(附demo)
參考資料:struts2 actions - Multiple Methods & Multiple classes

2017年2月18日 星期六

Spring_Struts2_Hebernat_資源配置

此章節是把練習常用的 maven 集合在一起
如果要使用
起把不必要的去除

<dependencies>
    <!-- Spring core & mvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.1.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.3.RELEASE</version>
    </dependency>

    <!-- Servlet Spec -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.39</version>
    </dependency>

    <!-- Json -->
    <!-- <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> 
        <version>2.8.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> 
        <artifactId>jackson-dataformat-xml</artifactId> <version>2.8.5</version> 
        </dependency> -->
    <dependency><!-- jackson -->
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.4.2</version>
    </dependency>

    <!-- 添加JUnit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>

    <!-- Struts2 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.1.8</version>
    </dependency>

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-convention-plugin</artifactId>
        <version>2.1.8</version>
    </dependency>
</dependencies>


web.xml
spring mvc 不適用
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Struts 2 Web Application</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>*.action</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>


只需看 pom.xml 和 web.xml 擺放位置

歡迎轉載,請註明出處。

2017年2月17日 星期五

JAVA-Struts2 入門初體驗 ( 三 )__註記型

此次 Struts2 配置用註解來完成
所以以此篇來說
就不用放置設定檔
首先在放置 pom.xml 放置用得到的 jar
並且設置完基本的 web.xml 設定
連結:設定前置動作




















註記型的 struts.xml 不用添加

在講述之前
先快速說明一下要如何進入此情境
以便於日後快速回想
( 缺圖 )

概述
一般頁面
一般頁面但有多個導頁或計算
一般頁面但有多個方法

此次註解說明:
@Namespace : 空間配置
@ResultPath : 默認情況下,它會找到結果頁在 WEB-INF/content/ 文件夾
@Result : 結果參照
@Action : 對應動作
results : 多種結果集合
location : 資源位置

一般頁面
http://localhost:8080/ProjectName/User/hello.action
說明:/User/hello.action 執行 hello 底下的 execute 方法
        返回的結果對應到上方 Result 所宣告的頁面
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="/WEB-INF/jsp/hello.jsp")
public class HelloAction {
    
    @Action(value="hello")
    public String execute(){
        return "success";
    }

}


一般頁面但有多個導頁或計算
http://localhost:8080/HelloStruts2Ann/User/userData.action
說明:執行對應的 userData 方法,但可能內部有邏輯判斷影響輸出的頁面
         我們就會用此結果導致對應頁面。
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value = "/")
public class UserDataAction {

    @Action(value="userData", results={
            @Result(name="success",location="/WEB-INF/jsp/userData.jsp"),
            @Result(name="fail",location="/WEB-INF/jsp/fail.jsp")
        })
    public String userData(){
        String aaa = "123";
        if("aaa".equals(aaa)){
            // doSomething
            return "fail";
        }
        return "success";
    }

}


一般頁面但有多個方法
http://localhost:8080/HelloStruts2Ann/User/userData1.action
or
http://localhost:8080/HelloStruts2Ann/User/userData2.action
說明:藉由不同對應的 uri 對應到對應的方法。
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value = "/")
public class UserDataAction {

    @Action(value="userData1", results={
            @Result(name="success",location="/WEB-INF/jsp/userData.jsp")
        })
    public String userData1(){
        return "success";
    }

    @Action(value="userData2", results={
            @Result(name="success",location="/WEB-INF/jsp/hello.jsp"),
            @Result(name="fail",location="/WEB-INF/jsp/fail.jsp")
        })
    public String userData2(){
        // return "fail";
        return "success";
    }
    
}





參考資料:Struts 2
歡迎轉載,請註明出處。

2017年2月16日 星期四

JAVA-Struts2 攔截器 Interceptor ( 二 )__實作

上一篇 : JAVA-Struts2 攔截器 Interceptor ( 一 )__說明

此篇是實作上篇所說明的程式碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <package name="user" namespace="/User" extends="struts-default">
    
        <!-- 攔截器 -->
        <interceptors>
            <!-- (單一)宣告自定義攔截器 -->
            <interceptor name="MyInterceptor" class="com.brian.example.interceptor.MyInterceptor"></interceptor>
            
            <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
            <interceptor-stack name="defaultInterceptorStack">
                <interceptor-ref name="MyInterceptor"></interceptor-ref>
                <interceptor-ref name="i18n"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
            
            <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
            <interceptor-stack name="defaultInterceptorStack111">
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
            
        </interceptors>
        
        <!-- 以下功能是針對 "全部" action ,所以只要經過 struts.xml 就一定會先經過他-->
        <!-- 如果有部分頁面或功能不需要到,就不要使用此功能 -->
        <default-interceptor-ref name="MyInterceptor"></default-interceptor-ref>

        <!-- 全部對應 result 頁面 -->  
        <global-results>  
          <result name="block">/WEB-INF/jsp/block.jsp</result>  
        </global-results>  
        
        <action name="hello" class="com.brian.example.action.HelloAction"
            method="execute">
            <result name="success">/WEB-INF/jsp/hello.jsp</result>
        </action>
        
        <action name="data" class="com.brian.example.action.DataAction"
            method="execute">
            <interceptor-ref name="MyInterceptor"/>
            <result name="success">/WEB-INF/jsp/data.jsp</result>
        </action>
        
    </package>

</struts>

以下是自定義攔截器
package com.brian.example.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("-----攔截器銷毀-----");
    }

    @Override
    public void init() {
        System.out.println("-----攔截器生成-----");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("---------攔截器---------");
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpSession session = request.getSession();
        // 判斷某事件,例如:Token. Record 記錄是否存在
        if (session.getAttribute("token")!= null) {
            // 建議
            System.out.println("Hello" + session.getAttribute("token"));
            // 如果存在,直接略過此攔截
            return invocation.invoke();
        } else {
            // 如果不存在,則導至某頁面
            return "block";
        }
    }
}


歡迎轉載,請註明出處。

JAVA-Struts2 攔截器 Interceptor ( 一 )__說明

想必大家之前也聽過 Filter
結果現在又跑出一個 Interceptor ( 攔截器 )

此功能可用於資料的判斷,比如:
1 . 此使用者是否已經登入
2 . 此使用者是否靜置不動一段時間
...等

這些都是很實用的功能

要講述此功能前要先講一個情境
以便於日後更快了解要如何實際應用
現在有兩個頁面
A : 歡迎頁面
B : 會員資料頁面( 需通過攔阻器的驗證才可進入 )














想必大家都知道攔阻器的功能吧
我們來把 A 和 B 串成一個流程
這就是大家最熟悉的登入會員流程了





















以下開始講程式面的說明
通常都是把攔阻器寫在 struts.xml 檔案內
攔阻器的設置如下
這部分只是類似宣告
還未開始被使用
<!-- 攔截器 -->
<interceptors>
    <!-- (單一)宣告自定義攔截器 -->
    <interceptor name="MyInterceptor" class="com.brian.example.interceptor.MyInterceptor"></interceptor>
    
    <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
    <interceptor-stack name="defaultInterceptorStack">
        <interceptor-ref name="MyInterceptor"></interceptor-ref>
        <interceptor-ref name="i18n"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    
    <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
    <interceptor-stack name="defaultInterceptorStack111">
        <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    
</interceptors>

以上攔截器設置完後
要如何使用??
1 ) 全域使用:所有的 Action 都先被攔截
皆可替換您在上方設置的任一個攔截器
<interceptors>
.
.
.
</interceptors>
<!-- 以下功能是針對 "全部" action ,所以只要經過 struts.xml 就一定會先經過他-->
<!-- 如果有部分頁面或功能不需要到,就不要使用此功能 -->
<default-interceptor-ref name="MyInterceptor"></default-interceptor-ref>

2 ) 部分使用:針對部分設置的 Action 才被先攔截
皆可替換您在上方設置的任一個攔截器
<interceptors>
.
.
.
</interceptors>
<!-- 只針對此 Action 先前攔截 -->
<action name="data" class="com.brian.example.action.DataAction"
    method="execute">
    <interceptor-ref name="MyInterceptor"/>
    <result name="success">/WEB-INF/jsp/data.jsp</result>
</action>


最後,如果要做自己專屬的攔阻器
必須要實作 Interceptor 
包括以下 :
1 . init:生成時。
2 . destroy:銷毀時。
3 . intercept:監聽,如果有攔截到特定資料,要如何處理。

參考資料:菜鸟学SSH(四)——Struts2拦截器
參考資料:从struts2拦截器到自定义拦截器
參考資料:struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
參考資料:Struts拦截器及Struts.xml文件详解
歡迎轉載,請註明出處。

2017年2月13日 星期一

JAVA-Struts2 入門初體驗 ( 二 )__配置型

前一篇我們有簡單提到專案大概架構
此篇我們要來實作用:設定檔案方法來完成




















在講述之前
先快速說明一下要如何進入此情境
以便於日後快速回想
( 缺圖 )


概述
一般頁面
一般頁面但有多個導頁或計算
一般頁面但有多個方法


接下來我們添加:struts.xml 設定檔
此篇只換講到 action 和 result 一些基本的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    
    <package name="user" namespace="/User" extends="struts-default">
        
        <!-- 一般 -->
        <action name="hello">
            <result>/WEB-INF/jsp/hello.jsp</result>
        </action>
        
        <!-- 一般執行 -->
        <action name="Login" class="com.brian.example.action.HelloAction"
            method="execute">
            <result>/WEB-INF/jsp/hello.jsp</result>
        </action>
        
        <!-- 一般執行但有多結果 -->
        <action name="Search" class="com.brian.example.action.UserDataAction"
            method="execute">
            <result name="success">/WEB-INF/jsp/success.jsp</result>
            <result name="fail">/WEB-INF/jsp/fail.jsp</result>
        </action>
    </package>

</struts>


一般
說明:沒有特定的動作,單純顯示對應的頁面
http://localhost:8080/ProjectName/User/hello.action

一般執行
說明:單一流程結果,執行的方法會對應到指定的 class 下的 method
http://localhost:8080/HelloStruts2Ann/User/Login.action

package com.brian.example.action;

public class HelloAction {
    
    public String execute(){
        return "success";
    }

}


 一般執行但有多個結果
說明:method 執行後出現多種不同的結果
http://localhost:8080/HelloStruts2Ann/User/Search.action

package com.brian.example.action;

public class UserDataAction {

    public String userData(){
        // doSomething
        // return "fail";
        return "success";
    }
    
}





歡迎轉載,請註明出處。

2017年2月8日 星期三

JAVA-Struts2 入門初體驗 ( 一 )

之前有稍微講過有關 Spring MVC
此篇概述入門,如果有錯誤歡迎留言












參考資料:Struts2系列

歡迎轉載,請註明出處。