学习了一遍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