javaEE servlet入门

来源:互联网 发布:如何自学sql server 编辑:程序博客网 时间:2024/05/01 21:40

一、HTTP协议:消息头的特点
1、用于客户端和服务器端说的悄悄话(消息头相当于服务器和浏览器之间的一些暗号指令)
二、HTTP协议:常用请求消息头
 Accept:通知服务器,客户端可以接受的MIME类型。(Tomcat\conf\web.xml记载着文件系统的文件扩展名和MIME类型的对应关系)
   MIME类型:大类型/小类型,比如text/html
 Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip压缩格式
 Accept-Language:浏览器所希望的语言种类
 Referer:取值为,当前页面由哪个页面过来的。防盗链;广告投放效果
 Content-Type:正文内容类型,只有表单时,且method为post时。效果等同于form表单的属性enctype="application/x-www-form-urlencoded"
  Content-Type:application/x-www-form-urlencoded
 User-Agent:浏览器类型.
 Content-Length:表示请求消息正文的长度
 *****Cookie:会话技术有关
三、HTTP协议:常用响应消息头
 Location:指定新的资源的地址。结合302或307响应码来使用,完成请求重定向。
 Content-Encoding:指示服务器给客户端的响应正文是经过gzip压缩的。
 Content-Length:指示响应正文的长度
 Content-Type:指示正文的MIME类型。(text/html;charset=UTF-8)
 Refresh:定时刷新。单位为秒。默认刷新自己
   刷新到别的资源:3;URL=/day04/1.html
 Content-Disposition:指示客户端下载资源
   Content-Disposition=attachment;filename=1.jpg
 *****Set-Cookie:会话技术有关
 以下三个头控制资源不要缓存
 Expires:-1  控制缓存的时间(毫秒值,比当前时间小)
 Cache-Control:no-cache (1.1)
 Pragma:no-cache(1.0)
 
四、Servlet入门
javax.servlet.Servlet接口:任何的Servlet必须实现的接口(被容器调用)
void init(ServletConfig config):初始化一个Servlet时会被调用
void service(ServletRequest req,ServletResponseresp):针对用户的每一次请求,此方法都会被调用
void destroy():当一个Servlet对象被摧毁时,调用该方法。

五、Servlet的编写步骤
1、建立标准的javaWeb应用目录结构
FirstApp
 WEB-INF
  classes
  lib
  web.xml
2、在classes目录下建立一个类,直接或间接的实现Servlet这个接口
package com.itheima;
import java.io.*;
import javax.servlet.*;

public class HelloServlet extends GenericServlet{
 public void service(ServletRequest req,
                            ServletResponse res)
                     throws ServletException,
                            IOException{
  String data = "helloservlet";     
  ServletOutputStream sos =res.getOutputStream();
  sos.write(data.getBytes());
  sos.close();
 }

}
3、编译java源文件(编译前把servlet-api.jar 加入到classpath中)
setclasspath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
进入到classes目录中,执行以下语句进行编译:
javac -d . HelloServlet.java
4、修改web.xml,对servlet进行URL映射
<?xml version="1.0"encoding="ISO-8859-1"?>


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
 <servlet>
  <servlet-name>HelloServlet</servlet-name>
  <servlet-class>com.itheima.HelloServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>HelloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>
</web-app>
5、访问该Servlet的地址是:http://localhost:8080/FirstApp/hello

六、Servlet的生命周期
1、默认情况下:只有第一次访问Servlet对象时,才会被实例化,并调用init方法。
2、只要初始化了,Servlet的对象就驻留内存了
3、当应用被卸载或者Tomcat被关掉时,才会调用destroy方法,释放Servlet占用的资源。
4、针对用户的每一次请求,服务器都会采用线程的机制调用service方法。

Tips:
编写一个Servlet也可以通过集成
javax.servlet.GenericServlet:覆盖掉service方法
javax.servlet.http.HttpServlet:于HTTP协议有关的Servlet,应该集成该类。
不应该覆盖掉其中service方法。因为其中有一些标准的实现,(典型模板方法设计模式)。
应该根据客户端的请求方式,覆盖掉doXXX方法。

 

Servlet规范的类包:
javax.servlet  存放的接口、抽象类与具体协议无关
javax.servlet.http. 存放的接口、抽象类与HTTP协议有关

小知识:
修改MyEclipse自动生成的Servlet的模板
1、关闭MyEclipse
2、找到MyEclipse的安装目录
3、搜索*wizard*,找到com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar
4、打开,找到templates\Servlet.java,此文件就是模板文件
5、(修改前先备份)修改该文件,再推回去
八、Servlet映射的细节
Tips:Servlet映射的细节
Serlvet映射的路径可以使用通配符*,但只有以下2中写法:
以*开头,以扩展名结尾:<url-pattern>*.do</url-pattern>
以*结尾,以/开头:<url-pattern>/action/*</url-pattern>

路径匹配多个Servlet映射时:
绝对匹配优先于通配符
都是用通配符时,/开头的优先级高
都是用通配符时,都以/开头又有多个匹配:从前往后开始匹配

如果一个Servlet的映射路径为一个"/",那么这个Servlet称之为默认的Servlet,
它负责处理所有找不到的映射请求路径。

Tips:Servlet的生命周期
当应用被容器加载时就初始化Servlet对象,而不必等到第一个用户来访时才初始化。
<servlet>
   <servlet-name>ServletDemo3</servlet-name>
   <servlet-class>com.itheima.servlet.ServletDemo3</servlet-class>
   <load-on-startup>2</load-on-startup><!--自然整数,从2开始。代表了初始化的顺序-->
</servlet>
 
七、Servlet的配置参数:ServletConfig
<servlet>
   <servlet-name>ServletDemo3</servlet-name>
   <servlet-class>com.itheima.servlet.ServletDemo3</servlet-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
   </init-param>
 <init-param>
    <param-name>aaa</param-name>
    <param-value>yyy</param-value>
   </init-param>
   <load-on-startup>2</load-on-startup>
  </servlet>

ServletConfig:代表了针对当前Servlet的配置参数init-param中配置的参数
常用的方法:
String getInitParameter(String paramName):获取指定参数名称的取值
Enumeration getInitParameterNames():获取所有的参数的名称

 

九、线程安全问题
1、SingleThreadModel接口是一个标识接口(过时了)
如果实现了该接口,可以在内存中搞出多个Servlet实例为用户服务;或者对为用户服务的方法进行同步处理。
具体看实现:
Tomcat服务器采用的前者。


尽量使用局部变量。

十、ServletContext对象
1、容器加载JavaWeb应用时,都会为之创建一个ServletContext对象。一个应用只有一个ServletContext对象。
2、ServletContext对象是一个域对象。
域对象说明其内部维护了一个Map<String,Object>,生命周期与ServletContext同在。
Map<String,Object> map = newHashMap<String,Object>();
public void setAttribute(String name,Object obj){//向Map中放东东
 map.put(name,obj);
}
public Object getAttribute(String name){
 return map.get(name);
}
public void remove(String name){
 map.remove(name);
}


a、实现Servlet间共享数据
b、获取JavaWeb应用的全局参数

<context-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </context-param>

String getInitParameter(String paramName)
Enumeration getInitParameterNames()
 
c、实现请求转发
请求重定向:客户端行为
请求转发:服务器的行为
RequestDispatcher getRequestDispatcher(Stringpath):path:目标的地址。该地址必须以"/"开头,此"/"就代表当前的应用/day04
RequestDispatcher.forward(request,response);
d、读取资源文件的三种方式
one:ResourceBundle:
特点:只能读取properties的配置文件。且只能读取类路径下的配置文件。
 可以在非Web环境下使用。
two:ServletContext:getRealPath(Stringpath):path资源的路径。该地址必须以"/"开头,此"/"就代表当前的应用/day04,返回在磁盘上的实际绝对路径。

特点:读取任何位置上的任何文件。
 只能在web环境下使用。
three:ClassLoader
特点:
 只能读取类路径下的配置文件。且可以加载任何的资源