学习目标:
1.ServletContext对象
2.ServletConfig对象
3.过滤器
4.文件上传/下载
5.验证码(实现/点击切换)
学习内容:
一、ServletContext对象
获得ServletContext对象:getServletContext();//父类GenericServlet中定义
页面传值:
request:只能是同一次请求下(转发)
session:只要是同一个客户端请求,共享这个session
ServletContext:同一个项目下,多个客户端共享
ServletContext对象能做什么?
1.获得服务器中某个file的位置(访问地址/真实地址)
context.getContextPath();web应用的访问地址
context.getRealPath("/upload");web应用中某个目录的真实位置
2.页面传值(访问同一个web应用的所有客户端都共享)
context.setAttribute("uName","fanfan");//存储值
getServletContext().getAttribute("uName");//获得值
getServletContext().removeAttribute("uName");//移除uName对应值
3.获得全局初始化参数
context.getInitParameterNames();//获得所有配置在web.xml中的param-name
context.context.getInitParameter(name);通过param-name获得param-value
二、ServletConfig对象
1.使用该对象获得servlet的类路径
2.使用该对象获得具体的servlet的参数
三、过滤器
1.是什么?
过滤器(filter)是浏览器与访问资源直接的一道过滤技术
2.有啥用?
帮资源进行划分,如果是受限资源则不能够直接进行访问
3.使用过滤器
a.导包 javax-servlet-api.jar
b.创建一个java类并实现javax.servlet.Filter接口
c.通过doFilter()进行过滤操作,FilterChain对象中的doFilter()表示放行
d.配置过滤器(设置需要过滤的资源)
4.定义过滤器规则
a.精确过滤 /MyFileter
b.后缀过滤 *.html
c.通配符过滤 /* /aaa/bbb/*
5.配置过滤器的两种方式
方式一:在web.xml中进行filter的配置 (推荐使用)
方式二:在filter中定义@WebFilter("/*")
6.配置过滤器的两种方式优先级
1.所有的过滤器都配置在web.xml中,优先级:从上往下加载
2.所有的过滤都用@WebFilter注解, 优先级:自定义的Filter类字母的字典顺序
3.既有web.xml的过滤器配置,又有@WebFilter注解配置 优先级:优先执行web.xml中的过滤器
4.在web.xml中与@WebFilter注解相同时,过滤两次(不推荐)
7.过滤器分类
1.前置:在放行前执行的过滤操作
2.后置:在放行后执行的过滤操作
3.环绕:在放行前后都有执行过滤操作
8.过滤器链
在同一个服务器资源(Servlet类)上可以添加多个过滤器,当用户请求资源时,会依次执行每一个过滤器,然后再执行目标资源,再依次通过过滤器响应客户端请求
优先级:参考第6点
9.过滤器案例
1.编码设置
2.登录过滤
案例:
//CheckLoginServlet
@WebServlet(name = "CheckLoginServlet", value = "/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uid = req.getParameter("uid");
String pwd = req.getParameter("pwd");
UserService service = new UserServiceImpl();
User user = service.login(uid, pwd);
if (user!=null) {
req.getSession().setAttribute("user",user);
resp.sendRedirect("/IndexServlet");
}else {
req.getRequestDispatcher("login.html").forward(req,resp);
}
}
}
//IndexServlet
@WebServlet(name = "IndexServlet", value = "/IndexServlet")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
User user =(User) (req.getSession().getAttribute("user"));
out.println("欢迎:"+user.getUsername());
out.flush();
out.close();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="/CheckLoginServlet" method="post">
<p><input type="text" name="uid" placeholder="请输入用户名"></p>
<p><input type="password" name="pwd" placeholder="请输入密码"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>