MENU

MySQLでcaching_sha2_passwordが出たときの対処法

f:id:kiserukun:20210611090227p:plain

 
エクリプスでデータベースにデータを保存しようとするとエラーが出ました

java.sql.SQLException: Cannot create PoolableConnectionFactory (Unable to load authentication plugin 'caching_sha2_password'.)

caching_sha2_passwordとは

 
以前のMySQLでの認証プラグインにはmysql_native_password が使用されいましたが MySQL8.0より新たに caching_sha2_password に変更されました。  

Command Lineで確認

mysql> create user user1@localhost identified by 'パスワード';
Query OK, 0 rows affected (0.11 sec)
 
mysql> select User, Plugin from mysql.user where User = 'ユーザー名';
+-------+-----------------------+
| User | Plugin |
+-------+-----------------------+
| ユーザー名 | caching_sha2_password |
+-------+-----------------------+
1 row in set (0.00 sec) 

caching_sha2_password が設定されている事が確認できます。

対処法

Command Lineで以下のコマンドを実行します。

mysql> ALTER USER 'ユーザー名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';

 
 
以上です!
   

参考

MySQL8.0 認証方式を変更する(Laravel5) - Qiita  
 

MySQLリファレンス
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors MySQL :: MySQL 8.0 Reference Manual :: 2.11.4 Changes in MySQL 8.0

 
 
 

【Java】生年月日から年齢を計算するプログラム

f:id:kiserukun:20210611090227p:plain

生年月日から年齢を返すプログラムを作成したのでアウトプットしておきます。  
java.time.LocalDateクラスを使用して作成していきます。

生年月日から年齢を計算する

今回の流れ
入力jspサーブレットクラス → 出力jsp

CalcServlet.java

サーブレットクラスです

package servlet;

import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/CalcServlet")
public class CalcServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  exec(request, response); 
 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  exec(request, response); 
 }

 private void exec(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
  String year = request.getParameter("year");
  String month = request.getParameter("month");
  String day = request.getParameter("day");
  
  
  Hold hold = new Hold();
  String age = getAge(year, month, day);
  hold.setAge(age);
  request.setAttribute("hold", hold);
  RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Result.jsp");
  dispatcher.forward(request, response);
 }
 
 private String getAge(String year, String month, String day) {
   String birthdate = year + "/" + month + "/" + day;

   DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/M/d");
   LocalDate localBirdhdate = LocalDate.parse(birthdate, formatter);
   LocalDate nowDate = LocalDate.now();
   return Long.toString(ChronoUnit.YEARS.between(localBirdhdate, nowDate));
 }
}

Hold.java

ageを保持するクラス

package servlet;

public class Hold {
 private String age;

 public String getAge() {
  return age;
 }

 public void setAge(String age) {
  this.age = age;
 }
}

 
 
あとは入力するjspファイルと結果を表示るjspファイル(今回はResult.jsp)を作成すれば完成です。

入力jsp(サンプル)

f:id:kiserukun:20210728134943p:plain

出力先jsp(今回はResult.jsp

f:id:kiserukun:20210728134946j:plain

生年月日を入力すると年齢を表示することができました。

大変参考にしたサイト www.l08084.com

【Java】DataSourceを使ってデータベースにアクセスする方法

f:id:kiserukun:20210611090227p:plain

初めてDataSourceを使いMSQLと繋いだので アウトプットします。
接続に3日くらい掛かってしまいました・・・



DataSource

事前にxmlファイルを設定しておく必要があります。

DataSourceではxmlファイルが必要

以下のように書きます

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Context>
<Context>
<Resource name="jdbc/データベース名" auth="Container"
type="javax.sql.DataSource"
username="ユーザー名" password="パスワード"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/データベース名?autoReconnect=true&amp;useSSL=false" />
</Context>

 
配置は以下の通りです
webapp/META-INF/context.xml

f:id:kiserukun:20210727193953j:plain  

autoReconnect=true&amp;useSSL=false

上記の記述はMySQLSSLで接続する際に以下のようなエラーが起きたため付け足しました。
エラーが出なければ記述する必要はないと思います。  
 
参考

hacknote.jp

 
 
 

DataSourceで接続する

InitialContext context = new InitialContext();
DataSource datasource = (DataSource) context.lookup("java:comp/env/jdbc/データベース名");
Connection connection = datasource.getConnection();

上の記述を書くことでデータベースへの接続を行います。  
 

.lookup("java:comp/env/jdbc/データベース名")

lookupメソッドを使い指定のデータベースにアクセスします。
jdbc/データベース名はxmlファイルのnameに該当します。

DataSourceで接続するサンプル

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;



public class DAO{
 public void setUser(User user) throws SQLException, NamingException {
     InitialContext context = new InitialContext();
     DataSource datasource = (DataSource) context.lookup("java:comp/env/jdbc/mydb");
     Connection connection = datasource.getConnection();
     
     String mysql = "INSERT INTO mydb_tb(ID, NAME)" + "VALUES (?, ?)";
     PreparedStatement prepared = connection.prepareStatement(mysql);
     prepared.setInt(1, user.getId());
     prepared.setString(2, user.getName());

     prepared.executeUpdate();
     connection.close();
 }
 

user.getId()、user.getName()はUserクラスのデータをデータベースにINSERTしています。





環境構築は骨が折れます・・・

【Java】全角入力すると???と表示される

f:id:kiserukun:20210611090227p:plain

全角入力すると表示が???と表示される

 
以下のように登録画面を作成していました f:id:kiserukun:20210722212542p:plain



登録しようと送信ボタンを押すと登録先のJSPファイルは

f:id:kiserukun:20210722213828p:plain


このような表示になり
データベースもわからない文字列になって保存されていました。

f:id:kiserukun:20210722214128p:plain





原因は文字コードの指定にあると判断し、 JSPファイルを調べました  






結果を表示するjspファイル

<%@ page language="java" contentType="text/html; charset=SJIS"
    pageEncoding="SJIS"%>
    <%@ page import="model.User" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="SJIS">
<title>Insert title here</title>
</head>
・
・
・

 
入力させるjspファイル

<%@ page language="java" contentType="text/html; charset=SJIS"
    pageEncoding="SJIS"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="SJIS">
<title>ユーザー登録</title>
</head>
<body>
・
・
・

結局、jspファイルには問題はありませんでした




解決方法

サーブレットクラスに以下のように記述します

  request.setCharacterEncoding("SJIS");



再度登録し直すと  
 
 
f:id:kiserukun:20210722215849p:plain  
 
データベースに全角表示が正しく表示されるようになりました。

+20%以上になったので投資信託売却

f:id:kiserukun:20210619154605p:plain こんにちはkiseruです。

投資信託を一部売却することにしました。

 
f:id:kiserukun:20210722085947p:plain

 
 
理由は評価損益(率)が+20%以上になっていることと、 日経平均が三万円を頭に伸び悩んでいるのことが理由です。

しかし、つみたてNISAは現在も積立中です。

 

売却したお金でどうするか

一番重要なのは売却したお金をどうするかということです。  
 
選択肢は以下の4つです

1.貯金にまわす
2.好きなものを買う
3.投資信託を買い増す
4.株を購入する

 
 
 

悩んだ末、本を参考に決定することにしました。  
 
参考にしたのがこちらの本です↓

こちらの本では

売却したお金を、毎月少しづつ投資信託に上乗せするという方法が紹介されています。  
   
入金力のない自分は「投資金額をどうやって増やしていくか」ということが悩みでした。 「33歳で手取り22万円の僕が1億円を貯められた理由」では

3.投資信託を買い増す

という方法で投資金額を増やしており、とてもわ参考になりました。

現在は買い増す方向で検討している状態です。 あとは、どのタイミングで動くか・・・







でも、個別株で優待も楽しみたい!という欲もあります(笑)





オススメの本です↓

WebServletがimportできなかった時の対処法

f:id:kiserukun:20210611090227p:plain

エラー内容

サーブレットクラスを実行しようとすると

Tomcatがエラーを吐き実行ができませんでした

よく見ると

f:id:kiserukun:20210720222855p:plain

javax.servlet.annotation.WebServletがインポートできません

というエラーを発見

対処法

 
 
プロジェクト → プロパティを選択
f:id:kiserukun:20210721063648p:plain  
 
 

ターゲット・ランタイム → Tomcat7以上を選択 f:id:kiserukun:20210721074107p:plain  
 
 

プロジェクト・ファセット → 動的Webモジュール3.0以上を選択 f:id:kiserukun:20210721074439p:plain  
 
 
エラーが解消されてTomcatが起動できるようになりました。 f:id:kiserukun:20210721074607p:plain

 
 
 
 
 
 
 
設定を適応しても新しいプロジェクトを立ち上げると同じエラーがでるときがありました。 設定を変えたつもりはないのですが・・・







参考サイト qiita.com




オススメの参考書

html→サーブレット→jsp で値を受け渡す方法

f:id:kiserukun:20210611090227p:plain

サーブレットを使い簡単な計算プログラムを作りました。

サーブレットは初めてだったので 忘れないうちにアウトプットします。  

ファイル構成

ファイルの位置は以下のようになります。 f:id:kiserukun:20210716211117p:plain

servletパッケージ

CalcServlet.java

package servlet;

import java.io.IOException;

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

/**
 * Servlet implementation class CalcServlet
 */
@WebServlet("/CalcServlet")
public class CalcServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        exec(request, response);    
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        exec(request, response);    
    }

    private void exec(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String inputNumber = request.getParameter("number");
        
        Hold hold = new Hold();
        Calc calc = new Calc();
        int value = Integer.parseInt(inputNumber);
        hold.setInputValue(value);
        int result = calc.calculate(value);
        hold.setCalculateResult(result);
        request.setAttribute("hold", hold);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Result.jsp");
        dispatcher.forward(request, response);
    }
    
}

Hold.java(入力した値を保持しておくクラス)

package servlet;

public class Hold {
    private int inputValue;
    private int calculateResult;
            
    public int getInputValue() {
        return inputValue;
    }
    
    public void setInputValue(int inputValue) {
        this.inputValue = inputValue;
    }
    
    public int getCalculateResult() {
        return calculateResult;
    }
    
    public void setCalculateResult(int calculateResult) {
        this.calculateResult = calculateResult;
    }
}

Calc.java(計算するクラス)

package servlet;

public class Calc {

    public int calculate(int value) {
        return value * value;
    }
}

 

htmlファイル

input.html(入力画面のファイル)

<!DOCTYPE html>
<html>
<head>
<meta charset="SJIS">
<title>計算プログラム</title>
</head>
<body>
<form action="/sample/CalcServlet" method="post">:
<p>計算する値<input type="text" name="number"></p>
<input type="submit" value ="送信">
</form>
</body>
</html>

jspファイル

Result.jsp(結果を表示するファイル)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>  
<%@ page import="servlet.Hold" %>
<%
    Hold hold = (Hold) request.getAttribute("hold");
%>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>計算プログラム</title>
</head>
<body>
    <p>答え</p>
    <form action="/example/input.html">
        <p><%= hold.getCalculateResult() %></p> 
        <a href="/sample/input.html">戻る</a>
    </form>
</body>
</html>

表示結果

このようになりました。 f:id:kiserukun:20210717104325p:plain

 

f:id:kiserukun:20210717104328p:plain

あとがき

サーブレットはとりあえずMVCモデルで 処理をhtmlから受け取った値を処理してjspに値を返すということがわかりました。