Baidu-Java Web开发入门
Web开发基本概念
Web开发
Q:
- Web程序入口在哪?Main方法?
- 有Web服务器就可以开发Web程序吗?
- BS与CS有什么区别?
- Java Web开发有什么特别?
- JavaScript/CSS/HTML分别是什么?
通信协议:HTTP
Web Server: 专门负责处理HTTP请求,返回HTTP响应
Web应用程序:CGI/FASTCGI
Web容器:Tomcat、Jetty
应用服务器:WAS/JBOSS/Geronimo
Cookie
Cookie是小段文本信息,包含名字,值,最大存活期(MaxAge)等信息。Cookie由Servlet发送给浏览器,在浏览器端被保存,然后在访问同一网站的时候,再由浏览器发回给服务器。
Cookie 可以用来标识用户,记录用户名和密码,已经用户的偏好等。
Cookie 根据最大存活期(MaxAge)又可以分为以下两种:
- 会话Cookie (MaxAge<0):在浏览器被关闭以后Cookie失效
- 持续性Cookie (MaxAge >0):Cookie在规定MaxAge之前有效,不管是否重启机器或者浏览器
Session
HTTP 协议是一种无状态协议
会话提供了一种方法来识别和保存在多个页面进行访问的用户信息。
从进入网站到浏览器关闭所经过的这段时间
Session可以存放用户信息
例子:购物车
HTTP Method
请求格式:
http://www.baidu.com/
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070601
Ubuntu/dapper-security Firefox/1.5.0.12
Accept:text/xml,application/xml,application/xhtml+xml,text/html
Accept-Language: en-us
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8
Keep-Alive: 300
Connection: keep-alive
Cookie: BAIDUID=36DA5FFA1E69B7CD2D8FF62AA7FE8282;
响应格式和状态码
HTTP/1.x 200 OK
Date: Wed, 28 Nov 2007 13:43:37 GMT
Server: BWS/1.0
Content-Length: 1609
Content-Type: text/html
Cache-Control: private
Expires: Wed, 28 Nov 2007 13:43:37 GMT
Content-Encoding: gzip
Http状态码
- 1xx:信息响应类,表示接收到请求并且继续处理
- 2xx:处理成功响应类,表示动作被成功接收、理解和接受
- 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
- 4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
- 5xx:服务端错误,服务器不能正确执行一个正确的请求
AJAX
Asynchronous JavaScript and XML
不更新整个页面的前提下, 与服务器交互
JSON
http://www.json.org/json-zh.html
一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
例子
{“name”:”SMITH”,”address”: {“city”:”beijing”,”street”:”chaoyang”,”postcode”:100025}}
层次划分
MVC
层次划分 | 功能示例 |
---|---|
Web层 | 处理Web请求、 渲染视图 |
业务逻辑层 | *Service/*Manager, 事务控制 |
数据访问层 | *DAO |
持久化层 | JDBC/Hibernate/Mybatis |
疑问:数据访问层和持久化层的区别?
Java规范
Java SE/Java EE
Servlet/JSP属于Java EE Specification
Java EE 6
- http://www.oracle.com/technetwork/java/javaee/tech/index.html
- Servlet 3.0
- JSP 2.2
- EJB3.0
容器
- Web容器
- EJB容器
Java Application Server
- Websphere
- Jboss
- Geronimo
- ……
Servlet
Servlet就是一个Java语言写成的类。Servlet扩展了Web服务器的功能。
Servlet 的生命周期由容器来控制
当对应于某个 Servlet 的请求到来的时候,容器会进行如下步骤:
- 如果该 Servlet 的实例不存在:
- 装载 Servlet 的类
- 创建 Servlet 的实例
- 初始化 Servlet 实例 (调用 init 方法)
- 调用service方法 (传入request、response 对象)
- 如果该 Servlet 的实例已经存在:
- 直接调用service方法
当容器需要卸载某个Servlet的时候,容器会调用Servlet的destroy方法
event
通过监听Servlet生命周期的event,可以对event进行选择性的响应
- ServletContextEvent v.s. ServletContextListener
- ServletContextAttributeEvent v.s. ServletContextAttributeListener
- HttpSessionEvent v.s. HttpSessionListener
- ServletRequestEvent v.s. ServletRequestListener
- ……
具体可以在部署描述文件(deployment descriptor )中用<listener>
元素来指定event的监听类:
<listener>
<listener-class>com.ibm.sample.listeners.MyContextListener</listener-class>
</listener>
其中,MyContextListener implements javax.servlet.ServletContextListener
.
简单Servlet示例:
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class PrimitiveServlet implements Servlet {
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("From service of PrimitiveServlet");
PrintWriter out = response.getWriter();
out.print("Hello! Roses are red.");
out.print("Violets are blue.");
}
public void destroy() { }
public ServletConfig getServletConfig() {
return null; }
public String getServletInfo() {
return null; }
public void init(ServletConfig arg0) throws ServletException { }
}
接口
- javax.servlet.Servlet
- javax.servlet.ServletContext
- javax.servlet.ServletRequest
- javax.servlet.ServletResponse
- javax.servlet.RequestDispatcher
类
- javax.servlet.GenericServlet
HTTP协议相关
接口
- javax.servlet.http.HttpSession
- javax.servlet.http.HttpServletRequest
- javax.servlet.http.HttpServletResponse
类
- javax.servlet.http.HttpServlet
初始化:
时间:在web容器加载和实例化 Servlet 类之后,在 Servlet 处理来自客户端的请求之前
方法:public void init()
在 Servlet 整个生命周期中只执行一次
任务:对Servlet进行一次性的初始化工作:读取配置信息、资源的初始化,如数据库连接等
在部署描述文件(web.xml)的 Servlet 元素中添加子元素 init-param,设置 init 参数的名称和值
在 Servlet 的 init 方法中,调用 Servlet.getServletConfig 获取 ServletConfig对象的引用
调用 ServletConfig.getInitParameter 获取 init 参数的值
Servlet的service方法:
服务器每次接收到对 Servlet 的请求,都会产生一个新的线程,然后调用 service 方法获取实际服务
在 GenericServlet 中,由如下方法来提供:
public abstract void service (ServletRequest req, ServletResponse res)
throws ServletException , IOException
在 HttpServlet 中, 由 doXxx方法来提供, 比如 doPost,doGet 等,根据实际的hTTP 请求类型进行调用
protected void doGet (HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException