1.1Servlet简介
把实现了Servlet接口的Java程序叫做Servlet;
- 编写一个类,实现Servlet接口;
- 把开发好的Java类部署到web服务器中;
1.1.1构建第一个Servlet项目
- 构建一个简单的maven 项目,删除src文件,这个工程就是maven的主工程;
- 编写Servlet的映射:我们写的时Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径;
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 注册-->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.yang.HelloServlet</servlet-class>
</servlet>
<!-- 请求路径-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
1.1.2Servlet原理
1.1.3ServletContext
Web容器在启动的时候,它会为每个Web程序都创建一个对应的ServletContext对象,它代表了当前的Web应用;
-
共享数据,在这个Servlet中保存的数据可以在另一个Servlet中拿到;
ServletContext servletContext = this.getServletContext();//servlet的上下文 String name = "lisi"; servletContext.setAttribute("userName",name);//上下文赋值 ———————————————————————————————————————————————————————————————————————————————————— //另一个Servlet对象 ServletContext context = this.getServletContext(); String userName = (String) context.getAttribute("userName");//从servletContext中取数据 resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.getWriter().println(userName);//在页面展示
-
获取初始化Web参数
<!-- 配置Web的初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/</param-value>
</context-param>
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");//获取Web初始化参数
resp.getWriter().print(url);
- 请求转发
//访问网页不变实现页面转发
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/other");//转发的请求路径
requestDispatcher.forward(req,resp);//调用forword 实现请求转发
- 读取资源文件
//在java目录下新建properties
//在resources目录下新建properties
//两个资源文件都会被打包到统一路径下:class,即类路径classpath;
InputStream steam = context.getResourceAsStream("/WEB-INF/db.properties");//当前项目路径下
Properties prop = new Properties();
prop.load(steam);
String userName1 = prop.getProperty("userName");
String email = prop.getProperty("email");
1.1.4HttpServletResponse
获取客户端请求过来的参数
-
负责向浏览器发送数据的方法:
resp.getOutputStream().println(); resp.getWriter().println();
-
负责向浏览器发送响应头的方法:
resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8");
-
1、下载文件应用
//1.获取下载文件的路径 String realPath = this.getServletContext().getRealPath("1.png"); //2.下载文件名 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); //3.让浏览器支持下载我们需要的东西,中文文件名用URLEncoder.encode编码,否则产生乱码 resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"utf-8")); //4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); //5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; //6.获取OutputSteam对象 ServletOutputStream out = resp.getOutputStream(); //7.将FileOutputSteam流写入到buffer缓冲区,使用OutputSteam将缓冲区中的数据输出到客户端 while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.close();
-
2、实现重定向
B一个Web资源收到客户端A请求后,B会通知A客户端去访问另一个Web资源C;
resp.sendRedirect("/get"); ///重定向,URL会发生改变
1.1.5HttpServletRequest
给客户端响应一些信息
//获取前端的请求参数,请求转发
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
String[] bobbies = req.getParameterValues("bobby");//多个选项
req.getRequestDispatcher("/get").forward(req, resp);//请求转发
1.1.6Cookie、Session
会话:用户打开一个浏览器,点击了很多超链接,访问多个Web资源,关闭浏览器,这个过程称之为会话;
保存会话技术
-
Cookie 客户端技术(响应,请求);
-
Session服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中;
-
Cookie:服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;
Session:服务器登记你来过了,下次你来的时候我来匹配你;
Cookie
- cookie一般保存在本地的用户目录下appdata;
- 一个cookie只能保存一个信息;
- 一个Web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- cookie大小限制4Kb;
- 300个cookie浏览器上限;
PrintWriter out = resp.getWriter();
//Cookie,服务器端从客户端获取,包含多个Cookie
Cookie[] cookies = req.getCookies();
//判断Cookie是否存在
if(cookies!=null){
out.write("你上一次访问时间:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("lastLoginTime")){
long lastLoginTime = Long.parseLong(cookie.getValue());
Date data = new Date(lastLoginTime);
out.write(data.toLocaleString());
}
}
}else{
out.write("这时你第一次访问本站");
}
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(24*60*60);//Cookie有效期
resp.addCookie(cookie);//响应给客户端一个Cookie
- 删除cookie:
- 关闭浏览器,自动删除;
- 设置有效期为0;
Session
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站他都可以访问!–>保存用户的信息;
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给session中存东西
session.setAttribute("name","lisi");
//获取Sessionid
String id = session.getId();
//使用Session
//多个servlet共享session
-
Session注销
-
手动注销(用户注销)
session.invalidate();
-
自动注销(15分钟后注销)
<!-- 15分钟后session自动注销--> <session-config> <session-timeout>15</session-timeout> </session-config>
-
Session与Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存,可以保存多个;
- Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要信息,减少服务器资源浪费);
- Session对象由服务器创建;
- Session使用场景
- 保存一个登录用户的信息;
- 购物车信息;
- 在整个网站中经常会使用的数据;
多个用户使用共享信息:ServletContext
1.1.7Filter
1、编写过滤器,实现Filter接口,重写方法;
public class FilterServlet implements Filter {
//初始化:Web服务器启动,就已经初始化了,随时等待过滤对象的出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//过滤中的所有代码,在过滤特定请求的时候都会执行
//必须要让过滤器继续前行
//chain.doFilter(request,response)
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
//让我们的请求继续走,如果不写,程序到这里就会被拦截停止
filterChain.doFilter(servletRequest,servletResponse);
}
//Web服务器关闭的时候,过滤器会销毁
@Override
public void destroy() {
}
}
2、配置XML文件
<filter>
<filter-name>filter</filter-name>
<filter-class>com.yang.FilterServlet</filter-class>
</filter>
<!-- 只要是访问这个网站的请求都会经过这个过滤器-->
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.1.8Listener
1、实现监听器的接口
public class ListenerDemo implements HttpSessionListener{
@Override
//创建session监听
//一旦创建session,就会触发一次这个事件
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount = new Integer(1);
}else{
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
2、注册监听器
<!-- 注册监听器-->
<listener>
<listener-class>com.yang.ListenerDemo</listener-class>
</listener>