java web編程學習1

  學習了一遍java之後,順其天然,便開始學習java web,因爲看了紅薯的博客便沒有想着去接觸框架,前人栽樹後人乘涼,我將紅薯的demo下載下來當實驗器材。php

&#160; 因爲以前有學過專作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>

&#160;java

&#160; 這個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

&#160; 看完了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"));
		}
	}

}

&#160; 這個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

相關文章
相關標籤/搜索