學習了一遍java之後,順其天然,便開始學習java web,因爲看了紅薯的博客便沒有想着去接觸框架,前人栽樹後人乘涼,我將紅薯的demo下載下來當實驗器材。php
  因爲以前有學過專作web的php,本覺得上手飛快,可是一開始就被java web的整個文件組織給唬住了,剛看到還以爲挺麻煩,沒辦法,要作java web不只須要jdk還須要tomcat這樣的容器,代碼不只要遵循java,整個文件部署還必須讓tomcat看懂。既來之則安之吧,我來好好看看,首先,我注意到了web.xml,這是之前作php的時候沒有的(因此說php就是一門純粹的web語言,<?php?>就直接開始幹了),全文以下:html
<?xml version="1.0" encoding="UTF-8"?> <!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> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>helloFilter</filter-name> <filter-class>demo.HelloFilter</filter-class> </filter> <filter-mapping> <filter-name>helloFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>hello_world</servlet-name> <servlet-class>demo.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hello_world</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> java
  這個xml最主要的兩個元素就是filter和servlet,filter按下不表,先說servlet,servlet不用說,像我這種菜鳥都已經聽了n次了,servlet節點下有三個子元素:servlet-name、servlet-class、load-on-startup。servlet-name不用說,我理解的就算能夠把它當成標識符,xx醫生說,這個servlet生了,給他取個名字吧。servlet-class也很好理解,學習java web確定學過java了啊,java是靠class組織起來的,這裏就是指明這個servlet在哪。load-on-startup這個是後面看書才找到的:先把它翻譯一下 加載-在-開始:也就說告訴容器(tomcat)別等用戶來你在初始化了,直接就在你開始的時候初始化吧,這個元素的值表示它的優先級,越小優先級越大。程序員
在servlet下面有個servlet-mapping,servlet-name和上面同樣,這樣就能對應了,否則怎麼叫xxx-mapping呢,下面的子元素:url-pattern,不用說這就對應與網址了,/hello告訴咱們只要訪問localhxxxxx/hello就能夠找到這個servlet了,後來看到servlet3.0已經支持直接在代碼中設置@webservlet註解來實現了。web
  看完了web.xml(打頭的weclome-file-list的就不說了),第一反應就是去看看demo.HelloServlet了,代碼以下:數組
package demo; import java.io.IOException; import java.util.EnumMap; import java.util.Enumeration; import javax.lang.model.type.PrimitiveType; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 最簡單的Servlet * @author Winter Lau */ @WebServlet("/hello.view") public class HelloServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private static void prt(HttpServletResponse res, Object o) throws IOException { res.getWriter().println(o); } @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { prt(res, "no controller"); prt(res, "authtype:" + req.getAuthType()); prt(res, "contextpath:" + req.getContextPath()); Enumeration headernames = req.getHeaderNames(); prt(res, "header:"); while(headernames.hasMoreElements()) { String name = (String)headernames.nextElement(); prt(res,"\t" + name + ": " + req.getHeader(name)); } prt(res, "method:" + req.getMethod()); HttpSession sess = req.getSession(); if(sess.getAttribute("age") == null) { sess.setAttribute("age", 18); } else { prt(res, sess.getAttribute("age")); } } }
  這個HelloServlet繼承自HttpServlet,紅薯提供的這個Servlet重寫了service方法,固然平常寫代碼應該都是直接使用doGet和doPost,service是起一個將HttpServletRequest和HttpServletRespone根據http不一樣的方法請求分發給具體的doXXX方法,講到這裏,就有種豁然開朗的感受了,學過http的都知道了,http無非是哪幾種方法,get、post、trace等等,tomcat的工做無非是將這些http請求轉換爲HttpServletRequest,提供一個HttpServletRespone供咱們給用戶相應的反饋。因爲我是抱着php程序員來找茬的心態來學習,難免作個對比,php將這些http請求封裝成數組$_GET和$_POST,和java比能夠算是一種很直接的方式,因此我把php當菜刀,方便順手,而java則維持了它從j2se來的風格,將java式的面向對象進行到底。兩種方式各有千秋,歸根到底,無非是避免了普通程序員直接寫cgi罷了(性能什麼的我就不扯了,osc上早就腥風血雨了,不要濺我一身血)。tomcat
接下來,學習方向就很清晰了,去學下三個類:HttpServlet、HttpServletRequest和HttpServletResponse。先寫到這裏,吃個早餐先。app