servlet
1. 概念:
Servlet是一个运行在服务端的java小程序,
是sun公司提供的一套规范(接口), 用来处理客户端请求,
Servlet的实质其实就是java代码, 通过java的API向客户端输出(动态)内容
Servlet运行需要一个运行环境,即需要一个Servlet容器,这里我们使用Tomacat。
2. Servlet (生命周期) API
1) void init(ServletConfig config)
何时执行: Servlet对象创建后执行
config参数的3个作用
a. 获得Servlet的名字
b. 获得ServletContext
c. 获得初始化参数initParm
2) void service(ServletRequest request, ServletResponse response)
何时执行: 每次请求都会执行
3) void destroy()
何时执行: Servlet对象销毁前执行
tomcat服务器工作流程
面试题:
1. 对XXServlet进行了10次访问, init destroy service各执行几次
request对象创建了几个 response对象创建了几个?
init 1次
destroy 不执行
service 10次
request对象 10个
response对象 10个
2. 请简述Servlet的生命周期
默认第一次访问时创建Servlet对象, 并执行init方法
服务器关闭前会销毁Servlet对象, 并执行destroy方法
每次访问都会执行service方法
3. Servlet的配置(2.5版本,3.0版本采用注解)
注意:所有的JavaWeb项目中web.xml都继承自服务器下的web.xml
1. url-pattern(url路径) 的配置
1) 完全匹配 访问的路径要和配置的路径完全相同才能访问到
2) 目录匹配 /a/b/* *表示任意
3) 拓展名匹配 *.拓展名
注意1: 2 3不能混用 /a/b/*.do
注意2: 缺省路径: /
表示匹配任意路径
Tomcat中任意资源访问都是通过Servlet
2. <load-on-startup>
会让Servlet在服务器启动时就创建对象
里面填的数字是优先级
3. <welcome-file-list>
<welcome-file-list>用于指定应用的首页
里面可以指定多个文件,应用服务器会按从上到下的顺序搜索,如果找到就了进入该页面,如果都遍历完了还没找到就会返回404错误代码给浏览器。
4. 开发中往往不会实现Servlet接口, 而会继承HttpServlet类
这样不用重写很多的方法
【ServletContext】
1. ServletContext对象
表示一个web应用的环境(上下文)对象,
内部封装了web应用的信息
该对象一个web应用只有一个
问题: 一个web应用里有几个Servlet对象?
可以有多个Servlet对象,但是只有一个ServletContext对象
2. 生命周期
创建: 该web应用被加载的时候创建(服务器启动或者发布web应用时)
销毁: web应用被卸载(服务器关闭的时候)
3. 获取ServletContext对象
ServletConfig.getServletContext();
也可以在HttpServlet中直接调用getServletContext()
4. 作用
a. 获得全局初始化参数
b. 获取web应用中任何资源的绝对路径(关键)
c. 是一个域对象
域对象的通用方法
context.setAttribute(name, object);
context.getAttribute(name)
context.removeAttribute(name);
例题:
1. 做一个登录功能
2. 登录成功之后, 显示一个标题, 5秒后跳转
3. 跳转到的页面显示 你是第几个登录成功的用户
package com.wowowo.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wowowo.database.ConnectionFactory;
import com.wowowo.service.UserService;
import com.wowowo.service.impl.UserServiceImpl;
/**
* Servlet implementation class LoginServletexe
*/
public class LoginServletexe extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService us = new UserServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
try {
//用了三层架构,异常处理事务,service层和dao层的代码不再给出,可以看看架构基础
us.login(uname,upwd);
//获取servlet上下文
ServletContext context = getServletContext();
Object value = context.getAttribute("hero");
//如果获取的值为空,那么就是第一次登陆,把k-v放到context里面
if(value==null){
context.setAttribute("hero", 1);
}else{
//否则不是第一次登陆,把value的值+1再放入
context.setAttribute("hero", (int)value+1);
}
//没有出现异常(用户名或者密码错误)就打印success,5秒后跳转
response.getWriter().write("success,5seconds to demo4");
response.setHeader("refresh", "5;url=/my1018/demo4");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//捕获到异常,即用户名密码错误
response.getWriter().write("failed");
response.setHeader("refresh", "1;url=/my1018/login.html");
}
}
}