2017年2月22日 星期三

Bootstrap-常用方法

1 . 文字位置
http://stackoverflow.com/questions/12829608/bootstrap-text-align-class

2017年2月21日 星期二

Bootstrap-基本用法( 一 )


必須先在頁面添加以下 Library
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


參考資料:Bootstrap Get Started
參考資料:利用Bootstrap Grid System排版的學習筆記

AngularJS-常用方法

1 . 點擊觸發兩方法:
http://stackoverflow.com/questions/17584432/using-ng-click-to-call-two-different-functions

2 . 表格格式錯誤提醒
http://wijmo.com/blog/easy-form-validation-in-angularjs/

3 . 點擊後,檢查表格後執行方法(Nikos Paraskevopoulos)
http://stackoverflow.com/questions/31159006/form-validation-on-ng-click-angularjs

3-1 . 確認表格輸入參數_最有效
https://jsfiddle.net/r8d1uq0L/

4 . no-repeat list
https://blog.rjmetrics.com/2015/09/02/8-features-of-ng-repeat/

5 . no-repeat 動態篩選
https://docs.angularjs.org/api/ng/filter/filter

6 . no-repeat table click 取得當列參數
http://stackoverflow.com/questions/15288047/angularjs-ng-click-on-repeat-table-row-not-working

7 . no-repeat list has if els 產生列表遇到判斷式
http://stackoverflow.com/questions/15810278/if-else-statement-in-angularjs-templates

8 . no-repeat filiter 排序 筆數...等教學
http://abgne.tw/angularjs/angularjs-getting-stared/filters-3.html

9 . no-repeat table 多項排序
http://stackoverflow.com/questions/31074578/how-to-reverse-sort-a-column-on-click-using-angularjs

10 . no-repeat 上下排序
https://scotch.io/tutorials/sort-and-filter-a-table-using-angular

10_1 . no-repeat 多重篩選
http://plnkr.co/edit/kozaU39E74yqjZCpgDqM?p=preview

11 . 下拉選單_初始化...等
http://jsfiddle.net/840cc677/9/

12 . angularJS function retrun
http://stackoverflow.com/questions/24215197/how-to-show-return-value-of-a-function-with-angularjs

13 . 顯示/隱藏元件
http://stackoverflow.com/questions/16660826/show-hidden-div-on-ng-click-within-ng-repeat
http://stackoverflow.com/questions/23035647/angularjs-ng-click-and-ng-show-to-show-a-div

14 . controller 互相溝通_第四點較常用
http://www.storagelab.org.cn/zhangdi/2014/11/19/%E4%B8%8D%E5%90%8Ccontroller%E4%BD%9C%E7%94%A8%E5%9F%9F%E4%B9%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E7%9A%84%E6%96%B9%E5%BC%8F/

angular.module("myApp", [])
    .controller('myCtrl', ['$scope', function($scope) {

        $scope.submit = function() {

        }
    }]);

2017年2月20日 星期一

JavaScript-常用方法

項目
1 . 頁面初始化
2 . 取得對應標籤參數
3 . 點擊事件
4 . Form 傳送資料,另一頁面接收( Jsp、Struts2 )

頁面初始化
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
<script
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
    $(document).ready(function() {
        
    });
</script>
<body>

</body>
</html>

取得對應標籤參數
<script>
    .
    var age = document.getElementById("editText").value;
    .
</script>
<body>
    .
    <input type="text" id="editText" value="" />
    .
</body>


點擊事件
<script>
    function myFunction() {
        .
        .
        .
    }
</script>
<body>
    <input type="button" id="btn" value="送出" onclick="myFunction()" />
</body>
</html>

Form 傳送資料,另一頁面接收( Jsp、Struts2 )
參考資料:How to pass the values from one jsp page to another jsp without submit button?
a.jsp
<form action="hello_4" method="post">
    <input type="text" name="name">
    <input type="submit" name="send">
</form>

b.jsp
<body>
    <% String name=request.getParameter("name"); out.print("Hello:"+name); %>
</body>


JavaScript-檢查 Form 內部元件是否為空

check form is null
參考資料:JS form check empty

JAVA-Struts2 入門初體驗 ( 五 )__參數傳遞__Action to Jsp

參考資料:struts2<S:iterator>遍历map小结
參考資料:Struts2 iterator 标签遍历 Map,List,数组(三十六)
參考資料:第一個 STRUTS 2 程式

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 擺放位置

歡迎轉載,請註明出處。

JQuery-遇到的問題彙整

身分證
http://liaosankai.pixnet.net/blog/post/24165900-%E8%BA%AB%E4%BB%BD%E8%AD%89%E9%A9%97%E8%AD%89%E7%A8%8B%E5%BC%8F-for-javascript-(%E7%B2%BE%E7%B0%A1%E7%89%88)

checkbox radio 參數 (name : Jaskaran singh Rajal)
http://stackoverflow.com/questions/2834350/get-checkbox-value-in-jquery

Two listBox
http://esausilva.com/2016/01/29/move-items-between-two-listbox-using-jquery-html-select-tag/

日期元件
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_input_date_value2
日期檢查
http://www.jquerybyexample.net/2011/10/validate-date-format-using-jquery.html

Android-工具彙整


Android Studio相见恨晚的操作锦集(9月22日更新)
http://www.jianshu.com/p/bc8f6bfe12c6?
Android攻城狮—全套必备神级工具(开发,插件,效率)
http://www.jianshu.com/p/0911efbf8009
Android开发人员不得不收集的代码(持续更新中)
http://www.jianshu.com/p/72494773aace
Gradle 完整指南(Android)
http://www.jianshu.com/p/9df3c3b6067a
Java中的多线程你只要看这一篇就够了
http://www.jianshu.com/p/40d4c7aebd66
Android开发架构规范
http://www.jianshu.com/p/99239b9c1630
Gradle隱藏KeyStore
http://www.jianshu.com/p/c848c021a2a0
AndroidStudio 混淆
http://www.jianshu.com/p/f9438603e096
编译时间从33.8秒降到4.5秒我只多做了一件事
http://mp.weixin.qq.com/s/CERa-5jVXoxBj9vgnL_Kiw
Android 初學網
http://www.vogella.com/tutorials/Android/article.html
Android 6.0 權限
https://litotom.com/2016/05/15/android-6-permission/
Android NoSQL
http://www.ithome.com.tw/news/92507
bottomnavigation
http://chirag-limbachiya.blogspot.com/2017/07/bottomnavigation-with-kotlin-use.html

Android-AndroidStudio 單元測試__JUnit

大家完成獨一無二的行動裝置方向後
想必針對某功能或某動作持續測試
以避免錯誤的發生

但是持續手動測試真的很沒有效率
但將測試程式寫至主程式內
不僅影響開發測試速度
如果是大量的測試那更加讓費時間
這時我們就會拉出獨立測試環境
讓他自己執行相關程式
我們專注於自己的開發
最後只需等待測試結果就可以了

說到這裡
我們先簡單說明一下此章節目的
1 . 如何使用 AndroidStudio 進行測試單元
2 . 介紹 AndroidStudio 測試單元
3 . AndroidStudio 測試的項目

1 . 如何使用 AndroidStudio 進行測試單元
首先我們要先在 gradle 匯入基本套件














2 . 介紹 AndroidStudio 測試單元
AndroidStudio 測試單元有分別:
1 ) 一般 Java 測試:也就是 Junit,基本上和 Android UI 操作無關。
2 ) Android 流程操作:顧名思義,直接操控 App 執行對應的操作。

1 ) 一般 Java 測試
首先先在 src 底下添加我們要測試的 Class














紅色區塊:執行步驟。
橘色區塊:執行結果。綠色正常,紅色有問題。
黃色區塊:執行內容。














最主要是用註記來判斷要執行的動作,常用註記如下:
@BeforeClass:方法首先被執行,只執行一次。
@AfterClass:方法最後被執行,只執行一次。
@Before:每執行 Test 前執行一次。
@After:每執行 Test 後執行一次。
@Test:測試的功能內容。
@BeforeClass/@AfterClass 都要皆為 static。

測試程式碼
package com.example.brian.helloandroid;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ExampleUnitTest {

    @BeforeClass
    public static void testBeforeClass() throws Exception {
        System.out.println("testBeforeClass");
    }

    @Before
    public void testBefore() throws Exception {
        System.out.println("testBefore");
    }

    @Test
    public void testCase() {
        System.out.println("--------");
        System.out.println("testCase");
        System.out.println("--------");
    }

    @After
    public void testAfter() throws Exception {
        System.out.println("testAfter");
    }

    @AfterClass
    public static void testAfterClass() throws Exception {
        System.out.println("testAfterClass");
    }

}

結果如下:
testBeforeClass
testBefore
--------
testCase
--------
testAfter
testAfterClass

Process finished with exit code 0









參考資料:Android Studio单元测试入门
參考資料:Android 单元测试: 首先,从是什么开始
參考資料:Activity 测试系列教程

2017年2月17日 星期五

JQuery-基本 用法

要用 JQuery 前我們要先簡單了解這是什麼東西?
他是以 JavaScript 為基礎的 Library。

那在開發上和  JavaScript 有什麼差異?
最主要是改善在使用 JavaScript 的一些不便利。而且也能讓開發
者更有效率的去開發,且內部也有大量的 UI 元件可以使用。

首先是前準備的工具:




參考資料:jQuery 教學 - 基礎篇
參考資料:JQuery

歡迎轉載,請註明出處。

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
歡迎轉載,請註明出處。

JAVA-Hibernate ( 一 )__說明

參考資料:hibernate的好处

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月10日 星期五

JAVA-Spring MVC 入門初體驗 ( 四 )_實作

20190609 整理多餘的程式碼

前面我們有提到基本簡介
此篇就在介紹實作的部分,此篇尚未講到 Bean 部分

我們實作有以下步驟:
1 . 匯入有需要的 Jar
2 . 設定 web.xml
3 . 設定 projectName-servlet.xml
4 . 攥寫 Controller
5 . 攥寫 Jsp

將這次此專案需要的 Jar 添加至 pom.xml 內
說明 : pom 的功能比較常用於匯入網路上的 Jar
為何不直接下載?是否能確定你我他都是載同一個版本??
<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>
</dependencies>


設定 web.xml
說明:
專案的進入點,所以要在這邊設定或過濾 Url 所要做的動作
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_1.xsd"
    version="3.1">

    <servlet>
        <servlet-name>HelloWeb</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWeb</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>


HelloWeb-servlet.xml (這是預設格式,如需指定檔案名稱,需要另外寫設定)
設定掃描註記之對象及頁面管理規範
將 Spring MVC 的設定檔注入設定
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.brian.prduct.controller" />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

Jsp 頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
    ${key}
</body>
</html>


其實這有點像我們之前用過的 Srvlet 只是把它用註記方法取代
說明:
@Controller 必須標注在開頭
並且將對應的 Uri 放置在對應方法的上方
package com.brian.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET )
    public String search(ModelMap modelMap) {
        modelMap.put("key", "hello");
        // 返回與要顯示的頁面名稱
        return "hello";
    }
    
}



我們執行剛剛所創建出來的專案 : http://localhost:8080/FirstSpring/hello















注意 : 請務必依照對應的位置擺放


























歡迎轉載,請註明出處。

2017年2月8日 星期三

JAVA-Struts2 入門初體驗 ( 一 )

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












參考資料:Struts2系列

歡迎轉載,請註明出處。