1.Servlet概述
Servlet是运行在服务端的Java小程序,是sun公司提供的一套规范,是JavaWeb三大组件之一(Servlet,Filter(过滤器),Listener(监听器))
Servlet的作用:用来处理从客户端发送过来的请求,并作出响应。
Servlet3.0会自动生成注解,可在浏览器直接访问,不需要配置xml
Servlet规范要求:Servlet程序必须实现javax.Servlet.http.Servlet接口。在实际开发中,一般不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,一般继承HttpServlet,而HttpServlet的父类GenericServlet已经实现了Servlet接口。
JavaEE规范中提供了Servlet接口实现类:
HttpServlet类:实现了service方法,没有实现Servlet接口
HttpServlet的父类GenericServlet类:实现了servlet接口,没有实现service
servlet的访问过程:
Request接收请求参数的方法:
Servlet的生命周期:

生命周期:就是一个对象从创建到销毁的过程。Servlet生命周期:Servlet从创建到销毁的过程。
Servlet何时创建:用户第一次访问Servlet,创建Servlet的实例(单实例)
何时销毁:关闭服务器或移除项目的时候。
第一次调用,将执行初始化方法init(ServletConfig)//ServletConfig:获取Servlet的配置信息。
每次调用都将执行Service(ServletRequest,ServlerResponse)
服务器关闭或项目移除,执行destroy()方法
Servlet的xml相关配置:
a. Servlet对象默认是在第一次访问的时候创建的,一个Servlet程序只有一个servlet对象。让Servlet在服务器启动的时候创建好,需要在xml文件的<servlet></servlet>标签中添加<load-on-startup>2</load-on-startup>,整数越小,优先级越高
b. url-pattern配置方式有三种
(1)完全路径匹配:以/开始,例如/codeServlet
(2)目录匹配,以/开始,以*结束,/*(所有),/aaa/*(aaa目录下的所有)
(3)扩展名匹配,如*.do,*.action,*.jsp。
tomcat获得匹配路径时,优先级:(1)>(2)>(3)
开发中的路径编写:
相对路径:需要找相对的位置关系,不能以/开始。./当前路径,../上一级目录
绝对路径:不需要找相对位置关系,以/开始。绝对路径中分为客户端路径和服务器端路径,客户端路径一定要加工程名,服务器端路径不需要加工程名。

c.缺省Servlet
可以将url-pattern配置一个/,代表该servlet是缺省的servlet
什么是缺省的servlet?
当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理
其实,web应用中所有的资源的响应都是servlet负责,包括静态资源
补充:tomcat服务器端的web应用文件,是由工程名+WebContent下的文件组成
2.ServletContext:上下文对象
服务器启动时,自动为每个web应用创建一个单独的ServletContext对象,一个web应用只有一个ServletContext对象。
用这个对象存放的数据可以在整个web应用中获得,可使用如下方法存取数据:
向ServletContext中存数据:void setAttribute(String name,Object object)
从ServletContext中取数据:Object getAttribute(String name)
移除数据:void removeAttribute(String name)
ServletContext对象的生命周期:
创建:该web应用被加载(服务器启动或发布web应用)
销毁:web应用被卸载(服务器关闭,移除该web应用)
怎样获得ServletContext对象:
1.ServletContext servletContext = config.getServletContext();
2.ServletContext servletContext = this.getServletContext();
ServletContext还可以读取Web工程下的文件(包括WEB-INF)
方法如下:(注意:读取的是服务器端的文件,不是eclipse工程下的)

示例代码:(由于读取的是服务器端文件,服务器重启会重置文件)
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context=this.getServletContext();
PrintWriter pw=response.getWriter();
//getResourceAsStream获得相对路径中的输入流对象
InputStream in=context.getResourceAsStream("/WEB-INF/classes/getWeb.properties");
Properties prop=new Properties();
prop.load(in);
System.out.println("name="+prop.getProperty("name")+"<br>");
//getRealPath获取绝对路径
String path=context.getRealPath("/WEB-INF/classes/getWeb.properties");//
FileInputStream fin=new FileInputStream(path);
prop.load(fin);
System.out.println("read_name="+prop.getProperty("name")+"<br>");
}
ServletContext的作用总结:
1.获得web应用全局的初始化参数

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String driver = servletContext.getInitParameter("driver");
System.out.println(driver);
}
2.获得web应用中任何资源的绝对路径(重要 重要 重要)
方法:String path = context.getRealPath(相对于该web应用的相对地址)
//getRealPath获取绝对路径
String path=context.getRealPath("/WEB-INF/classes/getWeb.properties");//
FileInputStream fin=new FileInputStream(path);
prop.load(fin);
System.out.println("read_name="+prop.getProperty("name")+"<br>");
杂:
ServletContext是一个域对象(重要 重要 重要)
什么是域对象?什么是域?
存储数据的区域就是域对象
ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);

初始化参数:
servlet的初始化参数:(可通过ServletConfig获得)
整个项目的初始化参数:(可通过ServletContext获得)

ServletContext servletContext = this.getServletContext();
String driver = servletContext.getInitParameter("driver");
System.out.println(driver);
扩展:通过类加载器加载服务器端的classes文件夹下的文件:注意文件路径,newwords.txt编译到classes文件夹下。

String path = getNum.class.getClassLoader().getResource("new_words.txt").getPath();
System.out.println(path);
案例:登录验证(ServletContext存取参数,记录登录次数)
package com.xing.testLogin;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import javax.servlet.ServletConfig;
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 com.xing.util.DBUtils;
@WebServlet("/login")
public class login extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
int count=0;
this.getServletContext().setAttribute("count", count);//把count放入ServletContext对象里
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
try {
Connection conn = DBUtils.getConn();//java.sql包
PreparedStatement ps=conn.prepareStatement("select * from user where username=? and password=?");
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
// request.getRequestDispatcher("success.html").forward(request, response);
int count=(int) this.getServletContext().getAttribute("count");//从ServletContext对象中取出count
count++;
this.getServletContext().setAttribute("count", count);//再放回去
response.getWriter().print("success:欢迎"+request.getParameter("username")+"次数:"+count);
}else {
response.getWriter().print("fail:"+request.getParameter("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
本文详细介绍了Servlet的概念、作用及生命周期,解释了如何配置Servlet并利用ServletContext对象进行数据存储与获取,同时展示了具体的示例代码。
924

被折叠的 条评论
为什么被折叠?



