servlet基础



servlet基础教程。

1.介绍Servlet的基本概念(***)
(Servlet、Servlet容器、Servlet vs. CGI)——————图示
1)它是由 java 编写的、服务端的小程序。相对而言,Applet和javaScript是客户端小程序。
2)基于Http协议的,运行在web服务器内的。Servlet和CGI都是运行在Web服务器上,用来生成Web页面。
3)没有 main 方法。是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应。
4)由容器管理和调用。这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。
5)Web 服务器的辅助应用,处理特定的用户请求,并返回响应。
web服务器,这里的服务器不是硬件概念,而是软件,常用的web服务器有 Tomcat,Jboss等
Tomcat是一个用java语言编写的web服务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。
6)继承 java 的优点,与协议、平台无关
2.开发第一个Servlet应用(**)
Web应用的结构
开发一个Servlet应用的步骤
1)建立 Web 应用目录(注意细节:各目录的位置、名称与包含的内容)
2)编写 Java 代码,如:HelloWorld.java
把生成的.class 文件放置到 WebRoot/WEB-INF/classes 目录下
3)编写配置文件:web.xml
放置到 WebRoot/WEB-INF/ 目录下
4)把整个 web 应用放到 %catalina_home%/webapps //放到 tomcat的 webapps目录下
3.分析Servlet应用(***)
1)Servlet的继承体系
javax.servlet.Servlet接口 –> GenericServlet抽象类 –> HttpServlet –> 自定义类
所有的servlet都必须实现该接口 处理各种协议(包括http) 专职处理http协议 也可继承GenericServlet
2)Servlet接口;GenericServlet抽象类;HttpServlet类
Servlet接口(位置:javax.servlet.Servlet) 定义了特定的生命周期方法:
init(ServletConfig config)
service(HttpServletRequest request, HttpServletResponse response)
destroy()
GenericServlet implements Servlet
实现了 init(ServletConfig config)、destroy()等方法;并提供了 init()方法。
还实现了 ServletConfig 接口。由于这是抽象类,所以必须实现抽象方法:service()
HttpServlet extends GenericServlet (位置:javax.servlet.http.HttpServlet)
具有父类 GenericServlet 类似的方法和对象,是使用 Servlet 编程常用的类
支持 HTTP 的 post 和 get 等方法。
3)容器如何找到指定的Servlet?(图示)
Servlet有 3 个”名字”: url 名、 应用中的逻辑名、 实际的名字
配置文件 web.xml 都把这几个名字一一对应起来了
Servlet是受容器管理的
request对象、response对象都是容器根据客户端请求而产生的。
容器根据url请求,通过DD(web.xml)配置(url名,内部逻辑名,完全限定名)定位具体的servlet。
容器根据客户请求创建/分配一个线程,并调用servlet的service()方法,把request对象、respone对象作为参数传过去
service()方法会根据客户端请求的Http方法调用不同的HttpServlet的方法(doGet(),doPost(),…);
Servlet使用response对象把处理完的结果响应到客户端。
service()方法结束后,线程要么撤销,要么返回容器的线程池;request对象、response对象都被gc回收。
4.使用Servlet来发送用户输入的信息
1)开发用户登录的应用
2)如何使用Form表单来提交数据
<form action=”login” method=”POST” enctype=”multipart/form-data”>
(1)action: 表单提交给服务器的哪个资源处理
“login” 为在 web.xml 中配置的 url-pattern 或者是 jsp、html 文件等。
(2)Get vs. Post方法的比较(使用Http Monitor)
GET—->通过 URL 提交表单信息,由于受到 URL 长度的限制,只能传递大约 1024(1K)字节。
通过 http monitor 工具截获请求信息(下面仅写出请求行,请求首部略):
GET /welcome/login.html?username=zhangsan&password=lisi HTTP/1.1
//GET是请求方式; /welcome/login.html是请求路径; ?号后面是参数列表,以&分隔; 最后是协议版本
POST—>通过 Http Body 提交表单信息,传输的数据量大,可以达到 2M。
由请求行、请求首部、消息体 三部分组成。数据包的形式发送。
参数放在消息体中,长度不再受限,更安全;而 GET 必须把参数放在请求行。
通过 http monitor 工具截获请求信息(大略):
POST /welcome/login.html HTTP/1.1 //请求行
Accept: …
Accept-Language: zh-cn,en-us;q=0.5
…..
Host: 127.0.0.1
….. //从请求行以下到这行,都是请求首部
username=zhangsan&password=zhangsan //消息体(有效负载)
enctype: multipart/form-data :在form中设置此属性后,传输的就是二进制数据,常可用于上传文件
5.如何在服务器端获得表单提供的数据
1)HttpServletRequest 对象
由 Web Container 封装了用户的 Http 请求数据包而生成,可通过它获得所有跟用户请求数据报相关的信息。
getProtocol():String ——返回对应的协议 (如:HTTP/1.1)
getMethod():String ——返回 http 对应的方法 (Get|Post)
getRemoteHost():String ——返回远程主机名 (如:127.0.0.1)
getRemotePort():int ——返回远程端口号 (如:55013)
getHeader(String config):String ——返回http对应的首部信息(参数如Accept-Language)
getParameter(String name):String ——返回指定参数(name)的值(value) (如:zhangsan)
getParameterValues(String name):String[] ——返回指定输入参数(名为 name)的所有值(输入的参数列表)
getParameterNames():Enumeration ——返回请求对象中全部输入参数的名称

2)解决 Servlet 的中文乱码问题
(1)响应输出静态页面时,处理中文信息乱码: response.setContentType(“text/html; charset=utf-8″);
(2)获取数据过程中,处理中文输入乱码(3 种方法):
方法一:设置字符编码来解决 post 方法提交表单中文乱码问题。
request.setCharacterEncoding(“gbk”);
response.setContentType(“text/html;charset=utf-8″);
必须在第一个 request.getParameter(“name”); 之前执行上面的语句。
方法二:重新生成指定编码的字符串
String name = new String(request.getParamete(“name”).getBytes(“iso-8859-1″));
方法三:修改服务器的编码设置——解决 get 方法提交表单中文乱码问题
例如:Tomcat,通过修改%TOMCAT%/conf/server.xml
加入 URIEncoding=”utf-8″
(3)静态 html 页面的中文化问题
<head>
<meta http-equiv=”content-type” content=”text/html; charset=gbk”>
</head>
6.请求路径
请求路径是把请求导向到一个 servlet 来响应服务。它是由几个重要的部分来组成的。
通过 HttpRequest 对象,暴露了如下信息(对照应用的目录结构):
1)上下文路径(Context Path)
该路径的前缀是和 ServletContext 相关的。
如果 Context 就是 Web 服务器的 URL 命名空间的缺省的根上下文时,那么上下文路径将会是一个空的字符串。
如果上下文并不是服务器的命名空间的根,则上下文路径就以“/”开始,但不能以“/”结束。
2)Servlet 路径(Servlet Path)
该路径就是直接与激活该请求的相应映射,它也是以“/”开头。
但要注意的是,如果指定的请求是与“/*”模式相匹配,则此时 Servlet 路径就是一个空字符串。
3)路径信息(PathInfo)
请求路径中除了上下文路径和 Servlet 路径以外的部分。
当没有额外的路径时路径信息就是空的(null),或者它会以“/”开始的字符串。
在 HttpServletRequest 接口中定义如下的方法来访问请求路径的相应信息:
getContextPath();
getServletPath();
getPathInfo();
值得注意的是,请求 URI 和路径的各部分之间的 URL 编码的不同之外,下面的等式恒成立:
requestURI = contextPath + servletPath + pathInfo