您的位置:首页 > 编程语言 > Java开发

Java WEB开发实战 之 第三部分:Servlet开发(1)【私塾在线原创】

2012-02-29 17:00 746 查看
Servlet是什么

是在服务器上执行的Java组件,也可以说是在服务器上执行的小应用程序
Web应用的请求/应答模式 (画图说明)





关于Web应用的请求/应答模式的说明:

1:Web应用的请求/应答大多数基于Http协议
2:一次Http调用指的是一个请求和应答的来回
3: Http协议是面向连接的,指在一个请求和应答的来回之间保持连接,请求时打开连接,响应完后关闭连接,所以也有的资料说“HTTP是无连接的”
4: Http协议是无状态的,服务器在发送应答后,不会保留关于客户端的任何信息,因此也无法分辨来自于同一客户端的多个请求是相关的
注意:就算是客户端和服务器位于同一台机器上,仍然是要通过网络来运行的
Servlet是什么(完整的)
Servlet能干什么
Servlet主要完成如下工作:接收、处理HTTP请求 和 动态生成HTTP响应
Web容器
Servlet运行在Web容器之上, Web容器是一个特殊的JVM,负责维护Servlet的生命周期及为每个请求生成线程

常用Servlet的API——javax.servlet包



注意:上面只是罗列的一些基本的API,不是Servlet全部的API

要研究怎么做,必然先要搞清楚到底要做些什么
一:当然首先是构建开发和运行环境,然后才会涉及具体的开发
1: 开发环境,Eclipse(初次学习期间不许用:MyEclipse,Dreamweaver之类的工具,也不要使用Eclipse的插件)
在Eclipse里面建一个新的Java工程,把tomcat/lib下的servlet-api.jar包引入到工程的library中即可
2: 运行环境:Tomcat,解压即可,配置好正确的JAVA_HOME,某些机器可能需要配置其他的,看运行提示

二:大家按前面讲过的组件体系结构,仔细思考一下,开发Servlet到底要做些什么
1:组件类——MyServlet类
2:部署描述文件——web.xml
3:把组件部署到服务器上
4:测试所写的组件是否能正确运行——在客户端也就是浏览器里面测试

war包:Web应用归档文件,结构如下:
XXX.war
--WEB-INF
--web.xml (必须)
--classes (可选,如果有的话,用来放web应用需要的类包)
--lib (可选,如果有的话,用来放web应用需要的其他的jar包)
njar包:Java归档文件,结构如下:
XXX.jar
--META-INF
--MANIFEST.MF(描述Jar文件的一些属性和配置)
near包:企业应用归档文件,结构如下:
XXX.ear
--META-INF
--application.xml(描述ear文件所包含的多个war或者jar,还有liberary)

常用的HTTP提交方法为post和get,最典型的GET方法:
1:用户在页面点击超链接
2:用户直接在浏览器地址栏输入URL
HTTP请求格式
请求方法 URL HTTP协议的版本号
提交的Head区信息
**空行**
客户端请求提交的数据,示例如下:
GET /servlet/examples.web.HelloServlet HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u)
Host: localhost:8088
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/
Accept-Encoding: gzip
客户端请求提交的数据

nHTTP应答格式
HTTP协议的版本号 应答状态码 应答状态码说明
应答的Head区信息
**空行**
返回的数据,示例如下:

java代码:
Content-Type: text/html
Date: Tue, 10 Apr 2001 23:36:58 GMT
Server: Apache Tomcat/4.0-b1 (HTTP/1.1 Connector)
Connection: close
<HTML>
<HEAD>
<TITLE>Hello Servlet</TITLE>
</HEAD>
<BODY BGCOLOR='white'>
<B>Hello World</B>
</BODY>
</HTML>


那么到底应该如何写一个基本的Servlet类呢?看个例子:

java代码:
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)  throws IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(“<HTML>”);
out.println(“<HEAD>”);
out.println(“<TITLE>Hello Servlet</TITLE>”);
out.println(“</HEAD>”);
out.println(“<BODY BGCOLOR=’white’>”);
out.println(“<B>Hello, World</B>”);
out.println(“</BODY>”);
out.println(“</HTML>”);
out.close();
}
}


总结一下:
1:写一个类,扩展HttpServlet类
2:实现doGet或doPost之类的方法
3:每个Servlet要求有一个public的、空参的构造方法

大家看看,写一个基本的Servlet是不是特别的简单呢?
有同学会说,那方法里面怎么写啊,不着急,写句打印就可以了。里面具体的怎
么写,待会儿再来研究

在web.xml中,配置示例如下:

java代码:
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>examples.web.FormBasedHello
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>


Web应用上下文名:由于一个web服务器上可以发布很多的Web应用,为了区分开这些应用,使用Web应用上下文名
Web应用上下文名默认就是Web应用的war包名称,可以被更改
Web应用上下文名通过URL中的第一个“层次”标识
URL的语法如下: http:// host: port/ context/ path/ file
示例:http://localhost:8080/mytest/book/booklist.html
ROOT的Web应用没有上下文名
在浏览器的地址栏输入:http://localhost:8080/mytest/test进行测试,然后可以在服务器tomcat的控制台看到输出了

注意:如果servlet类里面只是打印了一句话的话,那么此时IE是一片空白

对于Html的Form标记,有两个基本的属性如下:
ACTION– 指定form信息的目的地(相关的URL)
METHOD – 指定HTTP方法(GET或POST)
语法:
<FORM ACTION=’servlet-URL’ METHOD=’{GET|POST}’>
</FORM>
说明: servlet-URL配置的时候,要带上web应用上下文名,否则服务器不知道到底要访问哪一个应用了,比如前面的示例:“myweb/test”
GET与POST的选择
HTTP GET方法用于:
Form数据量小、数据的内容应在URL中可见
HTTP POST方法用于:
请求的处理过程改变服务器的状态(如在数据库中存储数据)、Form数据量大、数据的内容应在URL中不可见(如,口令)

Servlet通过HttpServletRequest来获取客户端的数据,根据前面的讲解可以看出,请求里面带着两部分数据,分别是Head区数据和应用数据(也就是客户端通过html的form提交的数据,也可以是直接get传递的参数)
HttpServletRequest API
可以从请求对象中访问Head区的数据

java代码:
getHeader(name) : String
getHeaders(name) : Enumeration
getHeaderNames() : Enumeration
getIntHeader(name) : int
getDateHeader(name) : Date
可以从请求对象中访问HTML form参数
getParameter(name): String
getParameterValues(name): String[]
getParameterNames(): Enumeration


Servlet通过HttpServletResponse来向客户端返回数据

java代码:
HttpServletResponse API
setContentType(String MIME_type)
getWriter() : PrintWriter
getOutputStream() : ServletOutputStream
addHeader(name:String, value:String)
addIntHeader(name:String, value:int)
addDateHeader(name:String, value:Date)


说明: getWriter() 和getOutputStream() 只能二选一,不可以同时使用
视频配套PPT,视频地址【 Java WEB开发实战视频课程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: