2017年12月30日 星期六

Java-切割、分割字串

想必各位大大對這需求一定不陌生吧
在此紀錄下來
希望大家一起分享一起交流

切割字串解析成每個字元
1 . 方法一
String s = "abcd,efgh";
System.out.println("Use String method : Char Array");
char[] a = s.toCharArray();
for (char c : a) {
    System.out.println(c);
}

Use String method : Char Array
a
b
c
d
,
e
f
g
h

2 . 方法二
String s = "abcd,efgh";
System.out.println("Use String method : String length and char At");
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    System.out.println(c);
}

Use String method : String length and char At
a
b
c
d
,
e
f
g
h

藉由特定的字串切割( Split )
1 . 字串切割
String s = "abcd,efgh";
System.out.println("Use String method : Split");
String[] strs = s.split(",");
for(String str: strs) {
    System.out.println(str);
}

Use String method : Split
abcd
efgh

2 .字串切割,但限制條件
String s = "abcd,efgh,ijkl,mnop,qrst";
System.out.println("Use String method : Split limit");
for (String retval : s.split(",", 3)) {
    System.out.println(retval);
}

Use String method : Split limit
abcd
efgh
ijkl,mnop,qrst

歡迎轉載,請註明出處。




2017年12月26日 星期二

Java-網頁憑證轉為 JKS 格式

1 . 命令提示字元目標移至 C:/.../jdk/bin
2 . 將下載好後的 *.cer 憑證放置此路徑下
3 . 更改以下指令檔案名稱並且執行
keytool -importcert -file <changedCertName>.cer -keystore <exportName>.jks -alias changeit
4 . 產生出來的 jks 會產生再此路徑底下

2017年12月12日 星期二

Android-手機震動(Vibrator)

可能在特定情境下
開發者要讓使用者知道狀態
有時會採用音效、震動模式
讓使用者知道是有觸發的
目前採用 Kotlin 語法,會與 Java 有稍許不同

在此先來記錄
以便之後用的到

思路:
1 . 手機權限存取
2 . 取得對應服務
3 . 設定震動參數

實作開始
1 . 手機權限存取
<uses-permission android:name="android.permission.VIBRATE" />

2 . 取得手機對應服務
var myVibrator = application.getSystemService(Service.VIBRATOR_SERVICE) as Vibrator;

3 . 設定手機震動參數
if (Build.VERSION.SDK_INT >= 26) {
    myVibrator?.vibrate(VibrationEffect.createOneShot(100, 10));
} else {
    myVibrator?.vibrate(100);
}

Source Code
import android.app.Service
import android.os.Build
import android.os.Bundle
import android.os.VibrationEffect
import android.os.Vibrator
import android.support.v7.app.AppCompatActivity
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var myVibrator1: Vibrator;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myVibrator1 = application.getSystemService(Service.VIBRATOR_SERVICE) as Vibrator;

        constraintCounterBackground.setOnClickListener(this);

    }

    override fun onClick(view: View) {
        when (view?.id) {
            R.id.constraintCounterBackground -> {
                println("item found");
                if (Build.VERSION.SDK_INT >= 26) {
                    myVibrator1?.vibrate(VibrationEffect.createOneShot(100, 10));
                } else {
                    myVibrator1?.vibrate(100);
                }
                var intCounterNum = (textCounterNum.text.toString()).toInt();
                textCounterNum.setText((intCounterNum + 1).toString());
            }
            else -> {
                println("item not found");
            }
        }
    }

}



參考資料:
Android-Vibrator
Android學習筆記 - 震動(Vibrator)
Android vibrate is deprecated. How to use VibrationEffect in Android>= API 26?

2017年12月10日 星期日

Android-Kotlin 監聽元件錯誤

近期用 Kotlin 開發 Android 時
會發現非常奇怪的錯誤會發生
通常是在匯入 interface 的時候
比如 View.OnClickListener...等
在此記下
以便於之後查閱

1 . 程式碼在此
package com.xxx.xxx.xxx.xxx

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        linearLayout.setOnClickListener(this);

    }

    override fun onClick(view: View) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        when (view?.id) {
            R.id.linearLayout -> {
                println("found");
            }
            else -> println("item not found");
        }

    }

}


2 . 導致錯誤...
Process: com.xxx.xxx.xxx.xxx, PID: 8563
kotlin.NotImplementedError: An operation is not implemented: not implemented
    at com.xxx.xxx.xxx.xxx.MainActivity.onClick(MainActivity.kt:19)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

解法:

去除預設的 TODO("not implemented")
結果程式終於能夠正常執行了

簡單的說法
提醒你要記得實作
但是在 Kotlin 下 TODO 是會起阻擋提醒作用的

參考資料 :
 [Kotlin]kotlin.NotImplementedError: An operation is not implemented: not implemented
NotImplementedError

2017年12月2日 星期六

Android-Logger 和 Log4j 的使用與差異

注意:目前 Log4j 有一些尚未完成,敬請見諒。

此篇語法為 Kotlin,宣告方法類似 Java ,只是順序不同

大家在開發程式的過程中
想必可能要了解或者是要更清楚流向
會用到 System.out.println、Logger、Log4j
此篇用談到如何在 AndroidStudio 用 Java Logger 和 Log4j

1 . 一般 Java Logger 方法
package com.light.blue.log.activity

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import java.util.logging.Level.*
import java.util.logging.Logger

class MainActivity : AppCompatActivity() {

    private val logger: Logger? = Logger.getLogger("MainActivity");

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // SEVERE   嚴重(特高級別)
        // WARNING  注意
        // INFO     訊息

        logger?.info("info message");
        logger?.log(SEVERE, "Server message");
        logger?.log(WARNING, "WARNING message");
        logger?.log(INFO, "INFO message");
        
    }
}









2017年11月12日 星期日

Java-數字千分位和小數處理

想必大家都有遇過數字算出來
卻要讓使用者辨別單位
只好把 千分位、小數點 發揮得淋漓盡致
在此也把遇到的情況記錄下來

try {
    Double number = 123456789.00000;
    NumberFormat numberFormat1 = NumberFormat.getNumberInstance();
    // 一般千分位,小數預設三位(四捨五入)
    System.out.println(numberFormat1.format(number));
    
    // 取消千分位,小數預設三位(四捨五入)
    numberFormat1.setGroupingUsed(false);
    System.out.println(numberFormat1.format(number));

    // 設置小數點後最大位數
    numberFormat1.setMaximumFractionDigits(8);
    System.out.println(numberFormat1.format(number));

    // 設置小數點後最小位數
    numberFormat1.setMinimumFractionDigits(0);
    System.out.println(numberFormat1.format(number));
    
} catch (IllegalArgumentException e) {
    System.err.println("資料無法轉換");
}



參考資料:java 千分位的添加和去除
參考資料:利用NumberFormat 設定小數點輸出至多、至少位數

2017年9月14日 星期四

Android-AndroidStudio use Kotlin

要如何在舊有的 AndroidStudio 使用 Kotlin 語法開發?

先確認 AndroidStudio 是否有 Plugin Kotlin










1 . 在 Project guild.gradle

buildscript {
    ext.kotlin_version = '1.1.3-2'
    repositories {
        jcenter()
    }
    dependencies {
        .
        .
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        .
        .
    }
}

2 . 在 App guild.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

dependencies {
    .
    .
    .
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    . 
    .
    .
}

點擊切換程式語言










更新 Kotlin










直接在 Activity 使用串接包
import kotlinx.android.synthetic.main.activity_base.*


2017年7月18日 星期二

Html-CheckBox 多選選單操作

我們要如何製作一個簡單的單選選單?
要如何取到選單對應的參數?
此篇文章會提到如何使用 JS (JavaScript), JQ (JQuery)


A
B
C
<form>
    <input type="checkbox" name="vehicle" value="0">A<br>
    <input type="checkbox" name="vehicle" value="1">B<br>
    <input type="checkbox" name="vehicle" value="2">C<br>
</form>

如何取出 select radioBox value ?

var valuelist = ''; 

$('input[name="vehicle"]:checked').each(function() {
    valuelist += this.value + ',';
});

Html-RadioBox 單選選單操作

我們要如何製作一個簡單的單選選單?
要如何取到選單對應的參數?
此篇文章會提到如何使用 JS (JavaScript), JQ (JQuery)

Male
Female
Other
<form>
      <input type="radio" name="gender" value="male" checked> Male<br>
      <input type="radio" name="gender" value="female"> Female<br>
      <input type="radio" name="gender" value="other"> Other
</form>

如何取出 select radioBox value ?

var radioVar = $('input[name=gender]:checked').val();

Html-Option 下拉選單操作

我們要如何製作一個簡單的下拉選單?
要如何取到選單對應的參數?文字?
此篇文章會提到如何使用 JS (JavaScript), JQ (JQuery)

以下是範例 :



<select id="selectId" onchange="changeOption();">
  <option value="0">請選擇</option>
  <option value="1">a</option>
  <option value="2">b</option>
  <option value="3">c</option>
  <option value="4">d</option>
</select>

如何取出 select option value ?

var optionVar = $('#selectId').val();

如何取出 select option text ?

var optionText = $('#selectId option:selected').text();

如何設置被選擇的參數 ?
$("#selectId").val("2").change();


2017年7月12日 星期三

JavaScript-客製化日期選單

// 年度
var date = new Date();
var minYear = 1940,maxMonth = date.getFullYear(),
    selectYear = document.getElementById('selectYear');

for (var i = minYear; i<=maxMonth; i++){
    var opt = document.createElement('option');
    opt.value = i;
    opt.innerHTML = i;
    selectYear.appendChild(opt);
}

// 月份
var minMonth = 1,maxMonth = 12,
    selectMonth = document.getElementById('selectMonth');

for (var i = minMonth; i<=maxMonth; i++){
    var opt = document.createElement('option');
    opt.value = i;
    opt.innerHTML = i;
    selectMonth.appendChild(opt);
}

// 預設日期
daysInThisMonth();

// 日期
function daysInThisMonth() {
  var date_var = new Date(date.getFullYear(), date.getMonth()+1, 0).getDate();
  var minDay = 1,maxDay = date_var,
      selectDay = document.getElementById('selectDay');
    selectDay.options.length = 0;
  for (var i = minDay; i<=maxDay; i++){
      var opt = document.createElement('option');
      opt.value = i;
      opt.innerHTML = i;
      if(i == 1){
      opt.selected = "true";
      }
     
      selectDay.appendChild(opt);
  }
}
 

2017年5月1日 星期一

Website-FireBase Hosting 靜態網頁部屬


此篇會從如何安裝、連結、部屬專案開始

會寫此篇的目的在於因為網路資訊過多
想整理出自己較能理解的版本
官方文件說明 : 連結

步驟概要
- 下載 Node.js
- 用 npm 串接 FireBase
- 將專案部屬到 FireBase

1 . 下載 Node js : 連結












2 .開啟命令提示字元,確認 NPM 是否確實安裝
npm -version















3 . 安裝相關套件,以便於後續使用
npm install -g firebase-tools















4 . 新增專案檔案夾
並且要有 public
還有 index.html( 放置在 public 底下 )
















6 . 命令提示字元指向此路徑
cd C:\Users\BluePC\Desktop\Test\public ( 建議用複製 )

4 . 執行 FireBase ,並且執行程序
firebase init ( 不用加 npm  )















這邊可能會出現需要權限的需求,所以必須串接你的帳號















輸入 Login 指令,成功後再次執行 firebase init
firebase login















5 .選擇 Hosting 選項















6 . 選擇 Firebase 底下的指定專案















7 .
































































參考資料 : Firebase Hosting 靜態網站部署試用
參考資料 : Firebase 架站
參考資料 : Get Started with Hosting

Mac
參考資料:Firebase Hosting 靜態網站部署
參考資料:https://andy6804tw.github.io/2017/12/14/npm-tutorial/
參考資料:【備忘録】npm -g install に失敗する

歡迎轉載,請註明出處。

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















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


























歡迎轉載,請註明出處。