Going my way

いいなと思ったことをメモしていきます。

馬鹿だけど声が大きく、歳を取っている人が幅を効かせる会社

とても腹立たしいことなんだけど、自分でモノを考えることができず、頭が悪い奴が幅を効かせる会社というのもある。
ただ歳を取っているだけで、なんら付加価値を生み出していないヤツにも関わらず、声がでかい人間の主張が通りやすい。

こういう現象を見るにつれ、大企業というのはある意味では病気のようなもので、みんなが頭がおかしくなっているんじゃないだろうか。

口ばっかり「成果主義」と言うけれど、成果で評価したらクビにせざるを得ないような奴がうじゃうじゃいる。
正直、今いる会社には、検索の仕方もわからないような馬鹿が闊歩していて、許しがたい状況になっている。

早くこの会社を辞めたい。
ただ、給料がいいから、辞める前に自分で金を稼げるようにならないと。

愚痴を言うだけでは意味がなく、今いる環境が自分の実力ということだ。

ただ、やっぱり査定のために評価したりするわけだけど、あれって本当に適当だよな~。
イメージで評価するもんなんじゃないのって思う。

部下の仕事ぶりを正確に把握できる人なんているの?
誰かの成果をうまいこと自分のものにして話している人ってたくさんいるじゃん。

やっぱり360度評価を取り入れるべきなんだと思うんだけど。
その人の評価を一番わかっているのは、その人の後輩だったりするんだよね。

それにしても、早く馬鹿はクビにしてほしいわ。
それか、そいつの尻拭いの分の金払ってほしいわ。

支出の額は、収入の額に達するまで膨張する

英国の歴史学者「シリル・ノースコート・パーキンソン」が提唱した、パーキンソンの法則の第一法則と第二法則。

「仕事の量は、完成のために与えられた時間をすべて満たすまで膨張する」
「支出の額は、収入の額に達するまで膨張する」

これについて、バフェットも同じようなことを言っている。

「the Dan Patrick Show」という番組で、

「お金に関する一番大きな間違いは何ですか?」

という質問にウォーレン・バフェットが答えていた。


一番大きな間違いは、正しい貯金の習慣を早いうちに学ばないことだと思います。

貯金というのは習慣なのです。

誰もが早くお金持ちになろうとします。
ゆっくりとお金持ちになるのはかなり簡単です。

しかし、すぐにお金持ちになるのは簡単なことではありません。

成功する人としない人の違い【いつも時間が足りない】

「仕事を先延ばしにすることは、片付けることよりも倍の時間とエネルギーを要する」
リタ・エメットの提示した法則。

時間の経過につれ最初は小さかった問題も、最後は簡単に鎮火できない大火事になってしまいます。

また、時間の経過によりやらなければならないことが増えてきてしまい、結果として
「いつも時間が足りない」
というような事になります。



うまく「人生を変えられた人」はすべてが「うまくいく」のを待たない。

成功する人としない人の大きな違いです。

生活が自然になんとかなるのを待たない。
仕事がうまくいくのを待たない。
家、家族の問題が解決するのを待たない。
やる気が出るのを待たない。


行動しない限り、モチベーションは得られない。


成功者のほどんどは、ある共通した習性がある。
それは、モチベーションを待たないことだ。
彼らは、行動からモチベーションを作り出す。



あなたには、いつかやろうと思っていてまだ手を付けていないことはありませんか?

世界長者番付ランカーの習慣と普通の人の習慣の違い

富豪(Wealthy)がやっていて「Poor」がやっていない習慣

88%がビジネス教本などを1日30分以上読む(「Poor」は2%)
86%が読書家である(「Poor」は26%)
81%が「To Doリストを必ず書く」(「Poor」は9%)
63%が移動時間にオーディオブックを聴いている(「Poor」は5%)
44%が仕事の3時間前に起きる(「Poor」は3%が実践)


どんなに忙しくても毎日30分の読書を欠かさないようです。

■よい習慣が好機をもたらし、悪習慣がマイナスの出来事をもたらす

86%が自己向上のための生涯教育の重要性を実感(「Poor」は5%)
84%がよい習慣が好機をもたらすと実感(「Poor」は4%)
80%が特定の目標達成にフォーカスをあてている(「Poor」は12%)
76%が悪習慣がマイナスの出来事をもたらすと実感(「Poor」は9%)
67%が目標を書き出している(「Poor」は17%)


■世界長者番付内の68%はゼロから財産を蓄えた人

世界の富豪と言えども、下積み時代は確実にある。
ちなみに、2013年の世界長者番付内の400人のアメリカ人のうち、68%はゼロから財産を蓄えた人だそう。


元ネタサイトの「Business Management Degree」を見ると、

Network 5+ hours or more each month 79% (Poor 16%)
というのもあるが、これは「人脈作りに毎月5時間以上費やしているかどうか」
ではないか。


また、Exercise aerobically 4days a week 76% (Poor 23%)
というのもありますね。

これは「週に4日運動しているかどうか?」で、やはり運動もしている。


あとは、富豪のほうがジャンクフードを食べるのも少ないようだ。

「人月」という言葉は失礼

確かに、失礼だ。
会社では、「稼働時間が少ない」と言われたことがある。

人間は機械ではない。
労働時間に対して「稼働時間」っていう言葉も失礼だ。


言われた時に、一瞬「?」ってなるよね。

人のことをなんだと思っているんでしょうか?
こういう言葉が出てくるような企業では働きたくないと思うし、そういった会社はずっと下請けのままでしょう。

一流企業になることはまず無いと思います。

優秀な人材が集まらないからです。

【勉強方法】勉強時間を増やす方法

ストップウォッチを使って学習時間を増やすことについて。

本の内容を要約してみると、以下のようになる。

学習効率を増大させる最大の秘密兵器が、このストップウォッチだ。

朝9時から晩の9時まで勉強したとしよう。
このとき、当然12時間勉強したわけではない。
実際には6時間もやってなかったりするのだ。

学習をスタートするとストップウォッチで学習時間を測定するのだ。
トイレに行く時間はもちろんストップウォッチを止めなくてはならない。

初めにこれをやってみると、学習有効率、つまり勉強時間として過ごした時間の中で、実質的に学習に使うことのできた時間の割合は5割にも見たないこともよく見られる。

と、本にあるように、ストップウォッチを使って、時間を見える化しようというものです。

実際に、ストップウォッチで測るようにすると、学習時間の空白は減っていきます。
つまり、学習有効率を高めることが出来ます。

せっかく、机に向かっているのに、実は全然勉強していなかったということを避けるためにもストップウォッチはお勧めだ。


・自責の念は必要ない
実際に測ってみてあまり勉強できてなかったとしても自分を責める必要はない。
そこから改善するために測っているんだから。

失敗によって傷つく痛みは、成功して得られる喜びの2倍にも及ぶと言われている。

ただでさえ、失敗による苦痛が大きいのにそれを自分でさらに大きくする必要はない。「自分に厳しくしても意志力は強くならない。

数々の研究で、自己批判は常にモチベーションの低下や自己コントロールの低下をまねくことが明らかにされている。


その他にも、色々とテクニックが紹介されていますが、要点だけ紹介する。

・学習の環境を整えよう
→勉強しやすい机と椅子を買って、椅子は壁を背にして配置する。

椅子と壁の距離は「やっと出られる広さ」に設定します。
椅子から離れづらくなって、ちょっとした休憩が減るため。
あと、学習の妨げになるものを目に見える位置に置かない。
今でいうなら、スマートフォンなどを手元に置いて勉強してはいけない。


・成功報酬を設定する
→13時間勉強したら映画を見てもいいなど、成功報酬を設定する。
この成功報酬は曖昧にしないため、必ず紙に明記する必要がある。


・焦りが集中力を呼ぶ
→まだ試験まで時間があると思ってのんびりしてはいけない。

とにかく時間は無いのです。
「試験日までの自分に与えられた時間は不足している」ということを客観的な事実として心に叩き込んでおくべきです。

逆に焦りすぎるのも問題ですので、個人により合う合わないがあると思う。


などなど。


この本は1995年に受験生に向けて書かれたものであるにも関わらず、社会人になっても使えそうなテクニックが紹介されています。
せっかくの限られた時間を使って勉強するのですから、できるだけ集中して密度の濃い時間を過ごしたいものだ。


■参考
「図説」超合格術―大学合格のための学習プランと心理テクニック
有賀ゆうさんの受験本。
著者が「もう二度と受験本は書かない。再販もしない」と宣言したこと。
この勉強法を実践して成果が出た受験生が続出したこと。

その後の受験本にめちゃくちゃ大きな影響を与えたことなどから、超プレミアム価格がついています。

Javaサーブレット dispatchの方法と仕組み

ディスパッチとは、サーブレットから他のリソースにリクエストを転送すること。
javax.servlet.RequestDispathcerインターフェースを利用する。

ここでは、ForwardServletに向けたリクエストをForwardServletBに転送する処理のサンプルを記載する。

package dispatch;

import java.io.IOException;

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

public class ForwardServlet extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		
		//コンソールに出力
		System.out.println("Call ForwardServlet");
		
		//RequestDispatcherオブジェクトは画面の遷移先を定義するオブジェクト
		RequestDispatcher dispatcher = request.getRequestDispatcher("/ForwardServletB");
		dispatcher.forward(request,response);
	}
}

getRequestDispatcherのパスの指定は、[/]で始まる場合はWebアプリケーションのルート(コンテキストルート)からの相対パスである。
[/]で始まらない場合は、リクエストされたURLからの相対パスである。

RequestDispatcher dispatcher = request.getRequestDispatcher("/ForwardServletB");

今回はrequest.getRequestDispatcher("/ForwardServletB");と設定した。
それは、web.xmlに以下のように定義したからだ。

  <servlet>
     <servlet-name>ForwardServlet</servlet-name>
     <servlet-class>dispatch.ForwardServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>ForwardServlet</servlet-name>
     <url-pattern>/ForwardServlet</url-pattern>
  </servlet-mapping> 
  
    <servlet>
     <servlet-name>ForwardServletB</servlet-name>
     <servlet-class>dispatch.ForwardServletB</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>ForwardServletB</servlet-name>
     <url-pattern>/ForwardServletB</url-pattern>
  </servlet-mapping> 
  

を見ると、
ForwardServletBのURLは、(コンテキストルート)/ForwardServletBに設定されている。


上記のサーブレット宛のリクエストを別のサーブレットに転送する。
転送先のサーブレットは以下のとおり。

package dispatch;

import java.io.IOException;

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

public class ForwardServletB extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		System.out.println("Call ForwardServletB");
		response.setContentType("text/plain; charset=Windows-31J");
		response.getWriter().println("ForwardServletBのメッセージ");
	}
}


ForwardServletにHTTPリクエストすると、ブラウザには下記のように表示される
http://localhost:8080/basic/ForwardServlet

ForwardServletBのメッセージ

Eclipse上でTomcatを利用する方法

■はじめに
ウィンドウ→設定
左側のツリーから「Tomcat」を選択する。

以下の項目を設定する。

Tomcatバージョン:使用するTomcatのバージョン
Tomcatホーム:Tomcatをインストールしたディレクトリ
コンテキスト宣言モード:Tomcatのコンテキストファイルの場所。「\apache-tomcat-6.0.35\conf\Catalina\localhost」の下に、プロジェクト名.xmlという名前のコンテキストファイルが作成される。


Eclipseのメニューから
「ファイル」→「新規」→「その他」→「Java」→「Tomcatプロジェクト」を選択

任意のプロジェクト名(ここではbasic)を入力して「終了」

JSPファイルの作成
プロジェクトアイコンを右クリック→新規→ファイルを選択

「hello.jsp」で作成

<html>
<body>
<h2> hello </h2>

<%= new java.util.Date() %>
</body>
</html>

eclipseのメニューの「Webブラウザーで開く」をクリックして、

http://localhost:8080/basic/hello.jsp

と入力すると、現在の日付が表示される。


eclipseサーブレットの作成
WEB-INF/srcを右クリック。
「新規」→「クラス」を選択

パッケージ名とクラス名を入力する。

以下のソースを入力

package test;

import java.io.IOException;
import java.io.PrintWriter;

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

public class HelloServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
	      throws ServletException, IOException {
		PrintWriter out = resp.getWriter();
		out.println("Hello Eclipse");
	}
}


web.xmlを登録する必要がある。

WEB-INFを右クリックして、新規ファイルの作成、web.xmlを作成する。

Tomcatをインストールしたディレクトリ/webapps/ROOT/WEB-INF/web.xmlをコピペして使うとミスが少ない。

以下のようにweb.xmlを定義する。
web.xmlを定義しないと、tomcatサーブレットを見つけられないのだ。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  
  <servlet>
     <servlet-name>HelloServlet</servlet-name>
     <servlet-class>test.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>HelloServlet</servlet-name>
     <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>
  

</web-app>


Tomcatを再起動して以下のURLを入力すると、ブラウザにHello Eclipseと表示される。
http://localhost:8080/basic/HelloServlet


【余談】
文字エンコーディングとは、出力する文字のエンコードの種類のこと。

エンコードとは、文字列を2進数のデータに変換すること。
デコードとは、2進数のデータを文字列に変換すること。

iSO-8859-1:欧米で使われている文字コード
Shift_JIS:日本語Windows環境で利用される文字コード
EUC-JP:日本語UNIX環境で標準で利用される文字コード
UTF-8:ユニコードをもとにした文字コードの1つで、国際標準として推奨されている
Windows-31J:MicrosoftShift_JISの拡張


MIMEタイプとは、インターネット上でやりとりされるデータの種類のこと。

JavaEE サーブレットのフィルターの使い方。

サーブレットのフィルタ

フィルタとは、サーブレットのリクエストやサーブレットからのレスポンスに対して、フィルタリングをかけるオブジェクトのこと。
フィルタを通すことで、リクエストが本来ターゲットとしているリソースを実行するまえにリクエストをラップして、ログをとったり、リクエストにオブジェクトを添付したり、ヘッダの値を追加・変更することができる。

■フィルターの仕組みの例

<ブラウザ> ----> <Filter> ----> <jsp>

あるJSPファイルを見ようとすると、定義されたFilterを通るように設定できる。

例えば、

filterMessage.jspにアクセスしようとする。
ブラウザに以下のURLを入力。

http://localhost:8082/web_comp/filterMessage.jsp

すると、以下のように、web.xmlで定義したFilterを通すように設定できる。

<ブラウザ> ----> <HelloFilter> -----> <filterMessage.jsp>

■フィルタの設定方法
web.xmlを定義するだけ。
定義は以下の通り。

	<filter>
	  <filter-name>hellofilter</filter-name>
	  <filter-class>myfilters.HelloFilter</filter-class>
	</filter>
	
	<filter-mapping>
	  <filter-name>hellofilter</filter-name>
	  <url-pattern>/filterMessage.jsp</url-pattern>
	</filter-mapping>

ソースコード

Filterのソースコード

package myfilters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloFilter implements Filter{
	private FilterConfig filterConf;
	
	public void init(FilterConfig filterConfig) {
		this.filterConf = filterConfig;
	}
	
	public void doFilter(ServletRequest request,
							ServletResponse response,
							FilterChain chain)
	throws IOException, ServletException {
		
		System.out.println(filterConf + " : Entering...");
		
		request.setAttribute("msgFromFilter","Hello Filter");
		
		chain.doFilter(request, response);
		
		System.out.println(filterConf + " : Exiting...");
		
		filterConf.getServletContext().log(filterConf + ": Filter finished.");
		
	}
	
	public void destroy() {
		this.filterConf = null;
	}
}

Jspソースコード
Filterで設定したメッセージを受け取って、表示する。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<html>
<head>
<title>メッセージ表示</title>
</head>

<body>
<center>
<h3> フィルタからのメッセージを表示</h3>
<%-- リクエストにバンドルされている属性を取得 --%>
<b><%= request.getAttribute("msgFromFilter") %></b>
</center>
</body>
</html>

ブラウザからJSPURIにリクエストを投げると、以下のように表示される。

フィルタからのメッセージを表示

「Hello Filter」

ディレクティブの説明。例外が発生したら例外ページにリダイレクトするJSPサンプルなど。

ディレクティブタブとは、JSPのページ全体に作用するような定義を行うタグのこと。

pageディレクティブタブ
JSPファイル全体に関する属性を定義する。
ページ内の文字コードの設定やMIMEタイプ、セッションの有無など。

<%@ page 属性="値" %>
<%@ page pageEncoding="UTF-8" session="false" %>

pageディレクティブタグで使用可能な属性

import・・・JSPで使用するページをインポートする。
extends
session・・・セッション管理に参加するかどうかを指定する
buffer
contentType・・・レスポンスのMIMEタイプと文字エンコーディングを指定する。
この属性で指定された情報がHTTPのContent-Typeのヘッダーに指定される。
例)

<%@ page contentType="text/html;charset=Windows-31J" %>

他には
autoFlush
isThreadSafe
pageEncoding
など。


includeディレクティブタブ
JSPファイルに静的なインクルードを行うときに使用する

taglibディレクティブタグ
JSPファイル内でカスタムタグを利用するときに使用する

■例外が発生したら例外ページにリダイレクトするJSPサンプル

例外が発生するJSP

<%@ page contentType="text/html; charset=Windows-31J" %>
<%@ page errorPage="CatchException.jsp" %>
<html>
 <body>
  <h1>例外発生!!!</h1>
  <% int[] array  = {1,2,3};
     for(int i=0; i < 5; i++){
        out.println(array[i]);
     }
  %>
 </body>
</html>

例外の転送先のJSP

<%@ page contentType="text/html; charset=Windows-31J" %>
<%@ page isErrorPage="true" %>
<html>
 <body>
   <h1>例外をキャッチしたJSP</h1>
   <%= exception.toString() %>
 </body>
</html>

http://localhost:8082/web_comp/Exception.jsp
にリクエストを送ると、

ブラウザには

例外をキャッチしたJSP

java.lang.ArrayIndexOutOfBoundsException: 3

と表示される。

JSP超基礎。ライフサイクルの説明など。

JSP(JavaServer Pages)はHTMLファイルにJavaプログラムを埋め込むことにより、サーバー側で動的なWebページを生成する技術です。

埋め込んだJavaプログラムコードはWebコンテナ内で動的に処理され、HTML形式のデータを作成しクライアントに返信されます。

JSPの特徴
コンパイル不要。Webコンテナがコンパイルする。

マッピング不要。web.xmlによるマッピングは行わない。

JSPファイルもコンテキストルート内に配置する。
配置場所は任意。

JSPはWebコンテナ内でサーブレットコードに変換されている。



JSPのライフサイクル

JSPサーブレットにもライフサイクルメソッドが提供されている。

public void jspInit() JPSサーブレットインスタンス化された時のみ実行される。
public void _jspService() JSPサーブレットにHTTPリクエストがある度に実行される。
pubic void jspDestroy() JPSサーブレットのオブジェクトが破棄される時のみ実行される


例:

<html>
<body>
  <%! public void jspInit(){
     	System.out.println("jspInit()");
      }
  %>
  
 <h1>
  <%
  	System.out.println("_jspService");
  	out.println("hello");
  %>
  
 </h1>
  <%! public void jspDestroy(){
      System.out.println("jspDestroy()");
      }
  %>
</body>
</html>

ブラウザで
http://localhost:8082/web_comp/lifeCycle.jsp
と打つと、「Hello」が表示される。

Tomcatコンソールには

jspInit()
_jspServiceと表示される。
以後、ページを読みなおすたびに
_jspServiceと表示される。

tomcatの基本設定のまとめ。

■web.xmlについて

web.xmlのルートはタグである。

web.xmlサーブレットを登録する

<servlet>
  <servlet-name>サーブレット名</servlet-name>
  <servlet-class>サーブレットクラス名</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>サーブレット名</servlet-name>
  <url-pattern>マッピングするURLパターン</url-pattern>
</servlet-mapping>

サーブレットの呼び出し
http://<ホスト名>:<ポート番号>/<コンテキストルート名>/

コンテキストルートとは、tomcatのwepappsの下に置かれるフォルダーのこと。


tomcatで一番最初に悩むのは環境設定だと思う。
eclipseを使うのはまだ後回しで、基本から見ていこう。

C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 9061-B91A です

 C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35 のディレ
クトリ

2012/04/28  23:03    <DIR>          .
2012/04/28  23:03    <DIR>          ..
2012/04/28  23:03    <DIR>          bin
2012/09/13  23:06    <DIR>          conf
2012/04/28  23:03    <DIR>          lib
2012/04/28  23:03            38,657 LICENSE
2012/09/21  00:46    <DIR>          logs
2012/04/28  23:03               574 NOTICE
2012/04/28  23:03             8,680 RELEASE-NOTES
2012/04/28  23:03             6,836 RUNNING.txt
2012/04/28  23:03    <DIR>          temp
2012/09/21  00:22    <DIR>          webapps
2012/04/28  23:38    <DIR>          work
               4 個のファイル              54,747 バイト
               9 個のディレクトリ  146,112,778,240 バイトの空き領域

C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35>

tomcat以下のディレクトリだが、webapps直下にあるフォルダーがコンテキストルートとなる。

繰り返すが、ブラウザで叩くのは、このような形式だ。
http://<ホスト名>:<ポート番号>/<コンテキストルート名>/


webapps以下にweb_compというコンテキストルートがあるとする。
その下に置くのは、WEB-INFというフォルダである。

└─web_comp
    └─WEB-INF
        ├─classes
        │  ├─chap1
        │  └─chap2
        └─src
            ├─chap1
            └─chap2

フォルダーはこんな感じだ。
classesやsrcを置く。

重要なのがweb.xmlである。
これはコンテキストルート直下に置く。

└─web_comp
    └─WEB-INF
        │  web.xml
        │
        ├─classes
        │  ├─chap1
        │  │      Sample1_1.class
        │  │
        │  └─chap2
        │          Sample2_1.class
        │
        └─src
            ├─chap1
            │      Sample1_1.java
            │
            └─chap2
                    Sample2_1.java

src以下にサーブレットのソースを書き、classes以下にコンパイルしたソースを格納する。

tomcatのbinフォルダがあると思うが、
その中のshutdown.bat→startup.batで変更が反映される。

http://localhost:8082/web_comp/2_1

とブラウザから入力すると、Sample2_1で書いたソースの結果がブラウザに表示される。

そのときのweb.xmlは以下の通り。

<?xml version="1.0" encoding="shift_jis"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com./xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
	<servlet>
	  <servlet-name>Sample1_1</servlet-name>
	  <servlet-class>chap1.Sample1_1</servlet-class>
	</servlet>
	<servlet-mapping>
	  <servlet-name>Sample1_1</servlet-name>
	  <url-pattern>/1_1</url-pattern>
	</servlet-mapping>
	
	<servlet>
	  <servlet-name>Sample2_1</servlet-name>
	  <servlet-class>chap2.Sample2_1</servlet-class>
	</servlet>
	<servlet-mapping>
	  <servlet-name>Sample2_1</servlet-name>
	  <url-pattern>/2_1</url-pattern>
	</servlet-mapping>
	
</web-app>

マッピングの名前とサーブレットの定義の名前を"一致させる"こと。
あとは、url-patternに書いたものをちゃんとブラウザのアドレスバーに指定すること。

一回表示できるようになったら後は簡単だ。
JavaEEは厳密にフォルダー体系が決められている。だから、まずはちゃんとxmlの意味や、フォルダの位置の意味を理解する必要がある。

そうしないと、いつまでも

HTTPステータス 404 -
 The requested resource is not available.

なんて不愉快なエラーに悩まされ、パソコンを殴りたくなる衝動と格闘しなければならないだろう。

最低限を書いたが、プロジェクトの都合上一刻も早くちゃんと調べたい人は、以下の書籍を買うべきである。

SUN教科書 Webコンポーネントディベロッパ(SJC-WC) 試験番号:310-083

サーブレット/JSP プログラミングテクニック

tomcatの設定と、jsp/サーブレットの基礎知識まとめ

tomcatのHTTP受信ポートの設定は以下のファイルの設定をいじる。
C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35\conf\server.xml

    <Connector port="8082" protocol="HTTP/1.1" 
               useBodyEncodingForURI="true"
               URIEncoding="UTF-8"
               connectionTimeout="20000" 
               redirectPort="8443" />

デフォルト8080で何かのポートと競合したため、ポート番号を8082変更した。

サーブレット/JSPAPIはJavaSEに含まれていない。
そんため、サーブレット/JSPのJARファイルをクラスパスに設定する必要がある。

ユーザー環境変数CLASSPATHという変数を新規に作成。
CLASSPATHに下記のjarのパスを記載
C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35\lib\servlet-api.jar;
C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35\lib\jsp-api.jar

システムの環境変数
pathに%CLASSPATH%;を追加する。

コマンドプロンプトを再起動する。

Tomcatの起動
C:\Program Files (x86)\Apache Software Foundation\apache-tomcat-6.0.35\bin>startup.bat

Server startup in 1680 ms

などのメッセージが出たら起動完了

tomcatの停止はshutdown.bat

tomcat以下のディレクトリ構成

├─webapps
│  ├─Chap1_1
│  │  └─WEB-INF
│  │      ├─classes
│  │      │  └─chap1
│  │      └─src
│  │          └─chap1

webapps
コンテキストルート。この下にwebアプリケーションに必要なディレクトリ、ファイルを格納する。

WEB-INF
コンテキストルート直下に必ず置かなければならないディレクトリ。大文字半角で記述すること。

WEB-INFの直下にはweb.xmlを置く必要がある。
tomcatは起動時にweb.xmlをパース(解析)する。

web.xmlサーブレットとURLの関連付けを行うXML文書である。

package chap1;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample1_1 extends HttpServlet {
	
	public void doGet(HttpServletRequest request,
						HttpServletResponse response)
	throws ServletException,IOException {
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");
		out.println("<<h1> hello! </h1>");
		out.println("<br>");
		out.println("</body>");
		out.println("</html>");
	}
}

web.xmlの記述

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com./xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
	<servlet>
	  <servlet-name>Sample1_1</servlet-name>
	  <servlet-class>chap1.Sample1_1</servlet-class>
	</servlet>
	<servlet-mapping>
	  <servlet-name>Sample1_1</servlet-name>
	  <url-pattern>/1_1</url-pattern>
	</servlet-mapping>
</web-app>

タグ内のものと、内のものを同じ名前にすること は完全修飾名(パッケージ名+クラス名)で書くこと は「コンテキストルート/○○」の○○の部分に対応する。 ブラウザで下記のようにリクエストを送ると、画面が表示される。 http://localhost:8082/Chap1_1/1_1 Chap1_1がコンテキストルート(web-appの直下)で、「/1_1」はSample1_1という名前のservletと対応した場所を示す。 つまりサーブレットの本体と、URLをマッピングしているのである。

SAXとDOMの使い分けのメモ

パーサーとは、XMLドキュメントの解析が可能なクラスのこと。
XMLパーサーを開発するための指標に

・SAX(Simple API for XML)
・DOM(Document Object Model)

がある。

■DOM
W3Cにおいて定義されている仕様。
XMLドキュメントの解析、検証、そして変更まで行うことが可能
XMLドキュメントの作成や操作を目的として使われる

■SAX
メーリングリストで討論の結果、開発されたもの
XMLドキュメントを順に読み込んで、読み取り専用で処理を行う
・システムリソースの使用を最低限に抑えるときに、DOMよりSAXを使う

短くなってしまったが、次回からJavaXMLファイルを解析するサンプルソースを書いていく。

XML基礎知識メモ(2)

XMLの文法を定義するにはDTD(Document Type Difinition)を作成する必要がある。
XMLドキュメントとDTDを関連付けるにはDOCTYPE宣言を使う。

DOCTYPE宣言には次の値を指定する。

DTDを適用させるルート要素の名前
・SYSTEMかPUBLICかを指定する
・ロードするDTDが置かれている場所を指定するURI


XMLドキュメントを定義するDTDが./dtds/book.dtdに置かれている場合

<?xml version="1.0" encoding="shift_jis"?>
<!DOCTYPE book SYSTEM "./dtds/book.dtd">

<book>

というように記述する。

PUBLICというキーワードを使えば、DTDの公開識別子を記述できる。
公開識別子とは、

システム識別子(./dtds/book.dtd)はSYSTEMというキーワードを使い、指定する。
システム識別子は、DTDが物理的に存在する場所を記述するURIのこと。
公開識別子はXMLパーサーがDTDの場所を特定するための名前のこと。

公開識別子に指定した値でDTDが識別できれば、公開されたDTDはローカルにコピーされる。

公開識別子を使ったXMLの記述例

<?xml version="1.0" encoding="shift_jis"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


実体とは、XMLドキュメントに組み込むことができる何らかの情報のこと
内部実体・・・DTD内に明示的に記述される
外部実体・・・DTDとは別の場所に格納されている
一般実体・・・XMLドキュメント内で参照されるように宣言する
パラメータ実体・・・実体がDTD内で参照されるように宣言する

一般実体を参照する方法

<tocEntry> &currentYear; 年のまとめ</toEntry>

実体名の前に「&」を付け、後ろにセミコロン(;)を付ける


パラメータ実体を参照する方法

<!ATTLIST response %yesNoCancel; "cancel">

先頭は「%」にする。
ATTLISTは属性を定義するキーワードである。