package com.tomcat.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet的生命周期大致可以分为三个阶段,分别是初始化阶段、运行阶段、销毁阶段。
客户端向Servlet容器发送HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否有该Servlet对象,如果有直接访问该Servlet对象,如果没有就要创建Servlet实例对象,然后通过init()方法实现Servlet初始化工作。
注意:init()方法只被调用一次!!!!!
这是Servlet最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象然后将他们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获取客户端发来的请求信息并处理该请求,通过ServletResponse对象生成响应结果。
注意:在Servlet整个生命周期内,对于Servlet的每一次请求访问,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest对象和ServletResponse对象
当服务器关闭或Web应用被移出容器时,Servlet随着Web应用销毁而销毁,在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占有的资源。
注意:在Servlet的整个生命周期中,destroy()方法也被调用一次。
当Tomcat初始化一个Servlet时,会将该Servlet的配置的信息封装到一个ServletConfig对象中,通过init(ServletConfig cofig)方法将ServletConfig对象传递给Servlet。ServletConfig定义了一系列获取配置信息的方法,接下来通过一张表来描述ServletConfig的常用方法。
方法说明 | 功能描述 |
---|---|
String getParameter(String name) | 初始化参数名返回对应的初始化状态参数值 |
Enmueration getInitParameterNames() | 返回一个Enumeration对象,其中包括所有的初始化参数名 |
ServletContext getServletContext() | 返回一个代表当前Web应用的ServletContext对象 |
String getServletName() | 返回Servlet的名字,即Web.xml中< servlet-name >元素 |
实例:
由于一个web应用所有的Servlet共享一个ServletContext对象,因此ServlerContext对象的域属性可以被该Web应用中的所有Servlet访问,在ServletContext接口定义了分别用于增加、删除、设置ServletContext域属性的4个方法。
方法说明 | 功能描述 |
---|---|
Enmueration getAttributeNames() | 返回一个Enumeration对象,该对象包含所有存放在ServletContext中所有域属性值 |
Object getAttibute(String name) | 根据参数指定的属性名返回一个与之匹配的域值属性 |
woid removeAttibute(String name) | 根据匹配参数指定的域属性名,从ServletContext中删除匹配的域属性 |
void setAttibute(String name,Object obj) | 设置ServletContext的域属性,其中name是域属性名,obj是域值 |
实例:
只适用于Tomcat3以上版本(好像是3,记不清了)
在Java类里添加
package cn.itcast.chapter06.session.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/logout") //这里就是路由的配置
public class LogoutServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute("user");
resp.sendRedirect("/wel");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
**@WebServlet("/logout") 此方法只能访问一个java文件 //这里就是路由的配置,此方法也是最常用的方法。**引号里面就是路由
hello
com.southwind.servlet.HelloServlet
hello
/demo2
打开web.xml进行添加代码。在上面的配置信息中,com.southwind.servlet.HelloServlet被设置为默认的Servlet,它对Tomcat服务上所有的Web应用都起作用。当Tomcat服务器中的某个Web应用没有默认的Servlet时都会将DefaultServlet作为默认的Servlet。当客户端访问Tomcat服务器中的某个静态HTML文件时,DefaultServlet会判断对应HTML是否存在,如果存在,将会以数据流的形式发给客户端,否则会报告404错误。
在HTTP响应消息中,大量数据是通过响应消息体传递的,因此,ServletResponse遵循IO流传递大量数据的设计理念,在发送状态消息体时,定义了两个输出流相关的方法,如下:
1、getOutputStream()方法:
获取字节的输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节组中的二进制数据。因此,要想输出二进制格式的正文,就需要getOutputStream()方法。
2、getWriter()方法
该方法所获取的字符输出对象为PrintWriter类型,由于PrintWriter类型对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档时,需要使用getWriter()方法。
3、设置解决中为乱码
第一种
//设置HttpServletResponse使用UTF-8
response.setCharacterEncoding(utf-8)
//通知浏览器使用UTF-8解码
response.setHeader("Content-Type","text/html;charset=utf-8")
第二种(最常用)
//包含第一种的两个功能
response.setContextType("text/html;charset=utf-8")
4.定时刷新网页
//指定地址的刷新;每隔两秒刷新一次
response.setHeader("Refresh","2;URL="http://localhost:8080/Login.html")
//普通刷新;每隔三秒刷新一次
response.setHeader("Refresh","3")
5、静止浏览器缓存页面
Expries:0
Cache-Control:no-cache
pragma:no-cache
package com.Servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/test") //路由访问 http://localhost:8080/test其中/test就是路由
public class HttpServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws SecurityException,IOException{
response.getWriter().write("Get"); //通过Get方法访问,则页面显示Get
PrintWriter out = response.getWriter();
out.write("This is Get!");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws SecurityException,IOException{
response.getWriter().write("Post"); //通过Post方法访问,则页面显示post
PrintWriter out = response.getWriter();
out.write("This is Post!");
}
}
首先写出一个接口类,对接Servlet。
package com.tomcat.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
再写一个类继承上面的 MyServlet2类
package com.tomcat.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class https extends MyServlet2 {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String method = request.getMethod();
switch (method){
case "GET":
this.doGet(request,response);
case "POST":
this.doPost(request,response);
}
}
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
void doPost(HttpServletRequest request, HttpServletResponse response)throws SecurityException, IOException{
}
}
真正实现对不同的请求方式进行处理(这样写的好处:可以对上面的代码重复利用!)
package com.tomcat.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test")
public class http extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("GET");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST");
}
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
(将ServletRequset对象转化为HttpServletRequset。)
HttpServletResponse response = (HttpServletResponse) servletResponse;
String method = request.getMethod(); //(获取请求方式!并赋值给method。)
switch (method){
case “GET”:
this.doGet(request,response);
case “POST”:
this.doPost(request,response);
}
}
下一章(会话及其会话技术)