今更サーブレットに再入門してみた【環境構築編】

JavaにおけるWeb開発の基礎であるサーブレットで基本的なWebサーバーを作成してみたので記録を残す

今回は環境構築だけなので、実際のサーバーのプログラミングについては別の記事で行う

なぜ今更サーブレットを触っているかというと、SpringBootの基礎を学ぼうとしたところサーブレットに行き着いたからである

基本的にどの教本やサイトにも書いてあることをやってるだけだが、有用な情報と言えばEclipse等を使わず直接Tomcatをインストールして、資材を配置し、起動するところくらいだろう

なお、環境はM1 Macである

Tomcat

Tomcatのインストール

最新バージョンとして10がリリースされているようなので、それをインストールする(アルファ版として11もあるようだが、今回は無理な挑戦はしないことにした)

以下のURLのCoreの欄のtar.gzをインストール

https://tomcat.apache.org/download-10.cgi

解凍して今回の作業フォルダにぶち込む

 

中を確認すると、servlet-api.jarがあった

サーブレットコンパイルするときはこれをクラスパスに含めないといけないらしい

ディレクトリの中身

Tomcatの起動

とりあえずtomcatを起動してみる。

一番上のディレクトリにREADMEがあったのでそれを読むと、まずはRUNNIG.txtがあるからそれを読めということなので指示に従う。

環境変数の設定

CATALINA_HOMEとJAVA_HOMEが必要だそうだ

CATALINA_HOMEはtomcatのインストール先だと思うので、これを記載する

JAVA_HOMEは普通に設定する

UNIX系だと.pidファイルを置くCATALINA_PIDもオプションで指定できるらしいが、特に気にしないのでデフォルトにまかしておく

起動

bin/startup.shを実行する

そしたらあっさりとこんな表示が出て起動したらしい

springと同じように8080ポートかなと思ってlocalhost:8080で起動してるかなと思ってアクセスしてみたらちゃんと起動していた。

なんか感動的

サーブレットの作成

「HttpServlet」クラスを継承したクラスを作ればそれがサーブレットクラスになるそうだ

また、doGet、doPostメソッドを実装することで実際に処理を書けるらしい

https://spring.pleiades.io/specifications/platform/8/apidocs/javax/servlet/http/httpservlet

ドキュメントを見ると、GET,POST,PUT,DELETEが一通り揃ってるっぽい。TRACEメソッドなんてのもあるらしい

とりあえず書いてみた

(最後にソースコードは記載する)

なんかjavaEE関連が認識されていない

どうやら、tomcatservlet-api.jarにパスを通さないといけなかったっぽい

エクスプローラーの下のJAVA PROJECTSの三点リーダークリックして、Configure Classpathに行き、Referenced Librariesにservlet-api.jarを追加すると、

すると無事治った

※ちなみに、今はjavax.servletではなく、jakarta.servletだった

JAVAEEは今Jakartaプロジェクトになったとかそんな話あったと思うが、ここでは掘り下げない

(上では、VSCodeの保管機能でインポートしてくれなかったので勝手にimport書いただけなので、赤線はjavaxだったからとかではない)

コンパイル

コンテキストの設定

tomcatに今回作っているサーブレットをアプリとして登録しないといけないらしい。

test.xmlというのを作り、以下のように記述して

<tomcatの配置ディレクトリ>/conf/Catalina/localhost

に配置する

<Context path="/test"
docBase="<サーブレットを置いてるプロジェクトの場所>"/>
web.xmlの設定

単にclassファイルをおけば良いというわけではなく、web.xmlに設定が必要らしい

 

まず、<servlet></servlet>でサーブレットを宣言する

そして、<servlet-mapping></servlet-mapping>でURIのパスと紐付ける

<?xml version="1.0" encoding="ISO-8859-1"?>
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
version="2.4">


<!-- サーブレットの名前をつける-->
<servlet-name>testservlet</servlet-name>
<servlet-class>TestServlet</servlet-class>
<!-- サーブレットに対してパスをマッピングする -->
<servlet-mapping>
<servlet-name>testservlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>

</web-app>
ファイルの配置

今まで作ってきたファイルを以下のように配置する

 

ちなみに、

apache-tomcat-10.1.18/conf/tomcat-users.xml

を編集し、適切なadminユーザーを設定して、

Manager Appを確認すると、登録されているかどうか見れる

 

tomcatを再起動して

http://localhost:8080/test/helloworld

にアクセスすると、無事Hello,Worldが表示された

 

今回使用したソースファイル

 
import java.io.*;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

response.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = response.getWriter();

out.println("Hello,World");

out.close();
}
}

最後の方はかなり投げやりになってしまったが、あくまで備忘録として残しておく

【2024】エンジニア5年目に突入する私の今年の目標

本記事では私の2024年の目標を、自己紹介を目的として書き連ねていく。

今年はエンジニアとしてXでFFを増やしたいと考えている。無闇やらに自発フォローをして数を増やすのではなく、質の高い交友関係を広めたいと思っている。私と気が合いそうな方に、この人となら繋がっても良い、もしくはこの人と繋がってみたいと思ってもらうために、私が何を目標として1年間過ごすつもりかを共有するのは大変有用だと思う。

(ということで、この記事を通してこいつと仲良くやって良いと思ってもらえたなら幸いです。)

結論「今年の目標一覧」

  • React/Nextを習得する(新しいスキルを習得する)
  • Springの上級者を目指す(スキルを極める )
  • 新しい言語を一つ学ぶ(視野を広げる)
  • 早寝早起きとジム通いをする(生活習慣を見直す)
  • 月に5冊本を読む(人生を豊かなものにする)

 

プロフィール

名前: 尾崎(途中で改名するかもしれない) https://twitter.com/loveradorit3

年齢: 今年で28歳

職業: Webプログラマ、SE(業務系SaaS開発)

技術スタック:

【業務で使用】(業務経験年数は満年数で全て切り捨て)

Java(SpringBoot) -業務経験3年, 個人では18歳でプログラミング始めた時から使用

TypeScript(Nuxt) -業務経験2年

【やったことある】

Python -業務経験半年, 個人的には3年くらい。ちょっとしたスクリプト書いたり、競技プログラミングをするのに使っている

Python(Django) -業務経験半年

PHP -プログラミング始めた頃はWeb開発のやり方をPHPで学んでいた

Ruby(Rails) -大学の卒業研究はRailsで書いた

他: JavaScript,HTML,CSS,SQL

使用機器: M2 Mac miniの一番やすいやつ、HHKB Type-S(白)、他Appleバイスは持ってる

【経歴】

某大学のCS学科を卒業後(ちなみに24歳まで学部生をやっていた)、SIerの受託会社に就職。そこで典型的な苦しいSIerの開発を経験する。

新卒で入った会社を2年で退職し、業務系SaaSを提供する会社にWebエンジニアとして転職。一通りモダンな開発を行っている。現在はなんかSEみたいなことをしていて、コーディングしないタスクも結構ある。

今年の4月で5年目のエンジニア

React/Nextを習得する(新しいスキルを習得する)

現在私はVue/Nuxtを使っているが、React/Nextを習得したいと思っている。

なぜかというと、業界においても、職場においても、Vueが使い続けられるか怪しいからである。ここでVueの将来について議論しても収拾がつかなくなるので言及しないが、とりあえず私はそういう感想をVueに対して抱いている。

Udemyの講座と、以下の本

TypeScriptとReact/Next.jsでつくる 実践Webアプリケーション開発:書籍案内|技術評論社

をやっていこうと思う。すでにUdemyの方は半分近く終わっている。

これは4月末くらいには完了させたい目標だ。

色々と触ってみて、作成したアプリケーションを公開していきたいと思う。

 

Springの上級者を目指す

現在業務でSpringBootを使用して、業務経験も3年くらいなので最低限のことは出来るようになっている。

今年はより上級者を目指すため、JPA, SpringMVC, DIの仕組み, Java EE周辺技術, 等々個別の技術を掘り下げていきたいと思う。

これはもう本とかあまりないと思うので、適宜ネット上のドキュメントを読んだり、英語の書籍を読むなりして身につけていきたい。

新しい言語を学ぶ

以下のスライドにふと辿り着き、大変良いものだと思った。

エンジニアとしてこの先生きのこるために - Speaker Deck

その中にあったものとして、「毎年一つ言語を学ぶ」とあった。これを実践したいと思う。

候補としては、

Scala (Java使いなので、また関数型に興味ある)

Kotlin (Java使いなので、アプリというよりはそのままSpringBoot開発したい)

Rust (低レイヤなこと勉強したい)

Go (多分今後転職とかで一番役に立ちそう)

個人的にはRust勉強したいと思っているが、キャリア的にはGoの方がいいかなと思うし、現在の業務的に他のJVM言語を触るのは有用だと思うのでScala,Kotlinも捨てがたい

早寝早起きとジム通いをする

私は大変不健康である。健康診断も毎年引っかかっており、毎日のように自律神経がおかしくなんとなくの不調が続いている。

エンジニアの業務のパフォーマンスに最も影響があるのは、「健康」であるということは、色んな自己啓発本を読んでも必ず書いてあることだ。

基本的に私は朝が早い(いつも6時半くらいに勝手に目覚める)が、いつも夜寝る時間が遅くなって仕事中眠くて生産性が落ちるということがたくさんあった。仕事の生産性のためにも、特に早寝をしたいと思う。

また、次の健康診断ではいい結果が出せるよう、週に4回くらいはジムにいこうと思う(すでに契約はした)。今の自分の状態で無理な有酸素運動は身体に良くないと思うので、まずは筋トレをしっかりしたいと思う。

月に5冊本を読む

読書は大事なのは自明である。なので月5冊読もうと思う。

5冊というのは、大体自分は一冊読むのに一週間くらいかかるので、この数値にした。一日で読み終わるような簡単な本も1ヶ月くらいかかる難しい本も読んでいきたいので、1ヶ月という単位で5冊と決めた。

この5冊という目標は必ず守り、明らかに読みきれそうになくても、飛ばし読みなどして絶対に5冊終わらせる。質よりもまず数値目標を必ず達成することが大事だ。

ジャンルとしては、技術書系:教養系:小説の比を1:3:1にしようかなと思っている

まとめ

私は社会人になってから4年間、しっかりとした目標も立てず行き当たりばったりで乱れた生活をしていた。しかし5年目近くになり、精神的な余裕ができたので、自分の人生を自分でコントロールする感覚を身につけていきたいと思う。

 

(この記事を読んで私に興味が出た人は、ぜひフォローや絡みお願いします!)

neovimで開発環境を整えた話

neovimでVSCodeみたいな統合開発環境を作りたかったので、以下その記録を残す。

VSCode統合開発環境なのか?エディタだろ!というツッコミがあるかもしれないが、拡張機能を入れればほぼ業務に耐えうる開発環境が得られるので、完成系としてVSCodeを目指す)

そもそもなぜVSCodeではなくnvimを使うのか

なぜなら、背景に可愛いイラストを表示しながらコーディングしたかったからである。

VSCodeは基本的に背景画像を設定したりすることはできない。一応直接設定ファイル(setting.jsonのことではなくアプリケーションそのものの設定ファイル)をいじれば表示できるみたいなことが書いてあるし(ただしmacでの事例は見つからなかった)、拡張機能も公開されている。しかし、拡張機能を利用すると毎回起動時にエラーが発生してしまい、アンインストールした後もずっと出続けてしまう。

と言うことで、VSCodeで背景に可愛いイラストを表示するのは諦めて、背景画像を設定したiTerm2上でnvimを利用することにした。

もちろん、なんかnvimでコーディングするのかっこいいよねと言うのもある。

業務のことを考えると普通にvscodeでいいと思うが、趣味の範囲で好みに合うnvim環境を作っていく。

環境

  • Mac mini (M2プロセッサ/8GB) ←macminiの一番安いやつ

  • MacOS Sonoma バージョン14.1.2

  • iTerm2 Build 3.4.19

完成系は以下

方針

LazyVimを使用する。

なぜなら、YouTubeで超イケてるコーディング動画をあげているエンジニアのdevaslifeさんが最新のブログ記事でそう書いていたからである。

一旦これを用いてセットアップを行い、その後さらにカスタマイズしていって最強の開発環境を手に入れようと思う

手順

Initialization

とりあえず公式ドキュメントのに書いてあるとおりInitializationをやる

以下は基本的に上記の資料をもとに書いているので参照しながら見てください

フォルダの整理

# required
mv ~/.config/nvim{,.bak}

# optional but recommended
mv ~/.local/share/nvim{,.bak}
mv ~/.local/state/nvim{,.bak}
mv ~/.cache/nvim{,.bak}

no recommendとあるが、 過去にちょっとでもnvimいじったのであれば、configファイルだけでなくshareのlua設定あたりも全部消しておく。

プロジェクトをclone

git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git

これで終わり あとはnvimを開くと以下の画面になる

nvim

背景を透過させるためにMake TokyoNight Transparentを入れる

上記の通り、cloneしてきただけでそれっぽくなった ただ、これではバックグラウンドにイラストが表示されないではないか!!!

公式ドキュメントを読み進めると、どうやら「Make TokyoNight Transparent」と言うプラグインがある模様 指示通りに導入する

プラグインファイル作成

どうやら、lazy.vimでは~/.config/nvim/lua/plugins配下に置いたプラグイン設定を書いた.luaファイルは自動で全部読み込まれるらしい。

とりあえず、ドキュメントに書いてあるとおりにファイルを作ってみる

# ファイル作成
nvim ~/.config/nvim/lua/plugins/transparent.lua

nvimが開くので、iキーを押し(流石にこれは普通のvimと一緒)ドキュメントに書かれた設定を記載する。

return {
  {
    "folke/tokyonight.nvim",
    opts = {
      transparent = true,
      styles = {
        sidebars = "transparent",
        floats = "transparent",
      },
    },
  },
}

return{}を忘れないこと 無事透過になった!

Neo-Treeを導入する

VSCodeや他の統合開発環境にみたいに、左端に開いているワークスペースのファイル・フォルダ一覧みたいなのを表示したい。 公式マニュアルにNeo-Treeの記載があったので、その通りに導入していく。

# ファイル作成
nvim ~/.config/nvim/lua/plugins/file-explorer.lua

「Full Spec」に書かれている設定を転載する。※return {}で囲うのを忘れないこと! するとこうなる。 多分いい感じにできた!

補足: あと、デフォルトで開くようにしたい。

nvim ~/.config/nvim/init.luaに以下を追記

-- 起動時にカレントディレクトリで:Neotreeを起動するようにする
vim.cmd("autocmd VimEnter * :Neotree .")

機能としてはまだまだなので、随時アップデートしていきたいと思う。