Servlet的方法对象总结

来源:互联网 发布:mac os 10.11.6 镜像 编辑:程序博客网 时间:2024/06/11 01:58
1.servlet 的方法 
 Service()方法 用来响应客户端的请求,代码方法放在这里面,
 与生命周期相关的方法,生命周期过程中,对象在某个特定的时刻必定会执行的方法,
 称为与生命周期相关的方法,比如人,在每个阶段 上学,工作,结婚,gameover
 destroy方法,servlet移除的时候,销毁的方法
 getServletConfig()获取初始化的参数
 
 重点:service(ServletRequest req,ServeltRespondse res)
servlet 运行在服务器的程序,客户机请求服务器的时候,服务器调用servlet的service方法
响应客户机的请求。即服务器的调用

ServletResponse对象  getOutStream ()方法
public calss FirstServlet extends GenericServlet(){
public void Service(ServletRequest req,ServeltRespondse res){
OutputStream out=res.getOutStream();
out.write("hello".getByte());
}
}
servlet 的运行过程
http://localhost:8080/day10 /ServletDemo
IE------------>web服务器---------------------------->3.解析出想要访问的主机名
4.解析出想要访问的web应用
1连上服务器 5.解析出想要访问的web资源
2.发送http请求: 6.------------------------------->
GET /day10/ServletDemo HTTP/1.1(请求消息头)第一次创建servlet实例对象
Accept-Language:zh-cn(请求消息行) 7.------------------------------>  ----》ServletDemo      
UA-CPU:X64 调用servlet的init方法完成初始化 9(service方法执行,向代表响应的response
Accept-Encoding:gzip,defiate8.--------------------------------> 写数据)
Host:localhost:8080/day10调用servlet的service方法 10.OutputStream out = response.getOutStream()
Connection:Keep-Alive响应客户端的请求,创建代表请求的 out.write ("data".getByte());
request和代表想响应的response11<---------
服务器从response里面去数据,回写给浏览器
12.回写http响应
HTTP/1.1 200 ok
Server Apache Coyote/1.1
Content-Length:16
Data:Fri,9 May 2015 14:55:10 GMT     13----->浏览器解析http响应,提取数据显示
servlet
hello
servlet的生命中周期:
servlet在用户第一次访问的时候创建,servlet一旦被创建,init方法就会执行,servlet在用户第一次访问的时候创建,servlet一旦被创建,init方法就会执行,
servlet 创建完成就驻留在内存中,客户端每次访问的时候,就会调用其中的service方法,servlet被摧毁的时候
servlet调用destroy方法,当然在web应用关闭的时候,或者servlet被移除的时候被摧毁。


Servlet 的web配置:
<Servlet>用于注册Servlet,<Servlet-name>用于设置Servlet名称,<Servlet-calss>用于设置Servlet完整名称

<servlet>
<servlet-name>ServletDemo</servlet-name>
<Servlet-class>cn.itcast.ServletDemo</Servlet-class>给服务器的
</servlet>
再配置servlet的对外访问路径:映射
<Servlet-mapping>
<Servlet-name>ServletDemo</Servlet-name>
<url=pattern>servlet/ServletDemo</url-pattern>
</Servlet-mapping>

关于jdk版本兼容的问题:jdk是向下兼容的,也就是说,低版本编译的代码,可以在高版本的jdk运行
而高版本的jdk编译的代码,不可以运行在低版本上。

Servlet 的两个默认的GenericServlet HttpServlet实现类
HttpServlet 覆写了service  方法

2.Servlet的重要细节

1·.copy 文件的时候,若要更改web应用的文件名,则同时 要更改Web Content-root
更改方法:选中文件-->右键-->Properties-->Myeclipse-->web选项,改成跟文件名一致。
2.<Servlet -mapping >可以配置多个,在一个Servlet应用里面,
改动web.xml文件不需要重新发布,改动java代码需要重新发布
*.do出现的优先级最低。

3.servlet 特点:servlet是一个供其他java程序(servlet引擎)调用的java类,它不可以独立运行
它的运行完全有Servlet引擎来控制和调度,即servlet由服务器来调度
Servlet生命周期很长,每次请求都会调用service 方法的request和response方法
但是,request,response的生命周期很短,不会出现服务器的崩溃

4.**缺省servlet:处理其他所以servlet都不处理的请求
静态web资源,1.html,http://localhost/8080/day10/1.html
浏览器是怎么读取到文件的呢?
浏览器向服务器发送请求,不管什么请求,都会去找servlet,服务器发现没有servlet映射这个文件,那么服务器
会去找缺省的servlet,服务器很读取缺省servlet把1.html打给浏览器,服务器擦能看到内容
服务器会默认配置一个servlet
<Servlet-mapping>
<Servlet-name>ServletDemo</Servlet-name>
<url=pattern>/</url-pattern>
</Servlet-mapping>
http://localhost/8080/day10/dfghjkl;乱写--->404
原理:向服务器发送请求,服务器查看有没有servlet映射文件
服务器发现没有这个servlet映射到这个文件,服务器会去找默认的Servlet,默认的servlet
也没有在服务器里面找到,就会跳出404的错误


5.ServletConfig对象:用于封装servletConfig的配置信息
Web服务器在调用servlet的时候,会传递很多的对象,request,response ,ServletConfiguration,ServletContext,
Session,Cookie

在Servletde 配置文件中,可以使用一个或多个<int-param>标签为Servlet配置一些初始化参数
当Servlet配置了初始化参数后,web容器在创建Servlet实例对象的时候会自动的将这些初始化的
参数封装到Servlet对象中,并在调用Servlet的init方法是,将ServletConfig对象传递给servlet
,进而程序员通过ServletConfig对象就可以得到当前的Servlet的初始化参数信息
在实际应用中,有些信息不适合在Servlet程序里写,通过初始化参数配置给Servlet
如:servlet采用哪个码表,servlet连接哪个数据库,servlet哪个配置文件
<Servlet>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</Servlet>

6.ServletContext 对象:
web容器在启动的时候,它会为每个web应用程序都创建一个对应的ServletContext对象,
它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,在编写servlet时,可以通过
ServletConfig.getServletContext()方法获得ServletContext对象

获得ServletContext的方法1
ServletContext context=this.getServletConfig.getServletContext();
获得ServletContext的方法2
 
7.ServletContext对象方法的应用
由于一个Web应用中的所有Servlet共享一个ServletContext对象,所以多个Servlet通过
ServletContext对象实现数据共享。ServletContext对象通常也被称为context域(范围)对象
其他 域对象:request,还有session page
 ServletContext域:
1.这是一个容器
2.servletContext域的作用范围是整个web程序范围
 
1ServletContext实现数据共享
:ServletDemo1中
String data="hello";
this.getServletContext.setAttribute("data",data);//把数据存进去
ServletDemo2中
String value=(String)this.getServletContext.getAttribute("data");//把数据取出啦
System.out.println(value);
2.获取应用的初始化参数
String value=this.getServletContext().getInitParameter("data");
System.out.println(value);
3.配置整个应用的初始化参数
<context-param>
<param-name>aaa</param-name>
<param-value>123</param-value>
</context-param>
4.转发与重定向
转发是,你找我借钱,我说我没有,我帮你找人借
转发是服务器的行为,客户机只发了一次请求
重定向是:你找我借钱,我说 我没有,我让你自己去找他。
 重定向是客户机行为,客户机发出了两次请求
转发用的多。
转发的示例:
ServletDemo:
String data=""aaa;
//把数据带给jsp(这里最好要通过 request带过去数据)
this.getServletContext().setAttribute("data",data);
RequestDispacher rs=this.getServletContext().getRequestDispacher("/1.html");
re.forward(request.response);

jsp:
<%
String data=(String)application.getAttribute("data");
out.write(data);
%>
5.ServletContext的生命周期,在服务器启动的时候创建 ,每一个Web应用都会有一个对应的ServletContext()
在关闭服务器或者web应用的时候,ServletContext才会销毁。

3.配置文件的问题:配置文件有两种,一个是properties,一个是xml文件,到底使用哪个,看数据有没有关系
数据之间没有关系,就用properties,有关系就用xml文件,如数据库的连接问题,就用
properties文件

1.ServletContext 读取配置文件的问题
//传统的读取配置文件的方法
InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//此方法表示 把资源文件作为流
//所有的Properties文件都必须用PROPERTIES 来读

properties prop=new Properties();
prop.load(in);
String url=prop.getProperty("url");
String username=prop.getProperty("username");
String password=prop.getProperty("password");
System.out.println(url+".."+password+".."+url);

//ServletContext方法读取配置文件 getRealPath(),再通过传统的流
String path=this.ServletContext().getRealPath("/WEB-INF/classes/db.properties");//获取到绝对路径
FileInputStream in =new FileInputStream(path);
properties prop=new Properties();
prop.load(in);
String url=prop.getProperty("url");
String username=prop.getProperty("username");
String password=prop.getProperty("password");
System.out.println(url+".."+password+".."+url);
这种方式的好处就是可以获取到 具体的资源文件 名字,因为有时候 读取的配置文件是客户机带过来的
不知道读取的文件名字,所以得绝对路径后,可以用 subString()截取文件名

String  filename=path.subString(path.LastIndexOf("\\"+1));
2.如果读取配置文件的程序不是Servlet的话,如java程序,读取配置文件的方式只能是类加载器
此时读取的配置文件不易太大,否则容易造成内存溢出
//连接数据库,读取配置文件,确定连接哪个数据库
InputStream in=UserDao.class.getClassLoader().getResourceAsStream("db.properties");

Properties prop=new Properties();
prop.load(in);
String value=prop.getProperty("url");
System.out.println(value);
3.静态代码块:
dao层里面有很多操作数据库的方法,为了,不让每一个方法调用时 都读取配置文件
让读取配置文件的方法放在静态代码块中,只读取一次就好了,即
static{
try{
InputStream in=UserDao.class.getClassLoader().getResourceAsStream("db.properties");

Properties prop=new Properties();
prop.load(in);
String value=prop.getProperty("url");
System.out.println(value);
}catch(Exception e){
throw new RuntimeException(e);
}
}
4.用类加载器读取配置文件的更新问题
类加载器读取配置文件,类加载只加载一次,所以,即使更改配置文件,还是读取的原来的配置文件
信息,而不是代码 放在静态代码块中只读取一次的问题,
若要读取更新的配置文件信息,解决办法是:
Strng url=UserDao.class.getClassLoader().getResource("db.properties").getPath();//通过类加载当做URL返回,然后获得再通过URL的getPath()得到路径
FileInputStream in=new FileInputStream(path);
Properties prop =new Properties();
prop.load(in);

System.out.println(prop.getProperty("url"));


0 0
原创粉丝点击