Day21-Sevlet与会话
Posted 2月2日
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day21-Sevlet与会话相关的知识,希望对你有一定的参考价值。
Servlet
简介
Servlet是sun公司开发动态web的一门技术
实现
Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现Serlet接口
- 把开发好java类部署到web服务器中。
Hello Servlet
-
创建一个maven项目
-
创建一个子模块,子模块可以调用父项目的各种依赖
-
在子模块中创建一个HelloServlet类
-
编写映射
-
为什么需要映射?
我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
-
-
配置tomcat
-
开始测试
原理
Tomcat包含web服务器和web容器
Mapping
一个Servlet可以指定一个或者多个映射
特殊情况
/* 将该页面设置为首页
xx/*,访问xx开头任意结尾的页面
通配符存在优先级问题:指定了固定映射路径优先级最高,如果没有就使用默认的请求
ServletContext
Servlet上下文对象
运行过程
web容器在启动的时候,会为每个web程序创建一个ServletContext对象
作用
-
共享数据:保存web程序在运行过程中的所想要存储的数据,其他web程序可以调用
-
获取配置信息:通过
context.getInitParamer()
获取web.xml中配置的信息<context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>
-
请求转发
路径不发生改变
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.print("HelloServlet"); ServletContext servletContext = req.getServletContext(); servletContext.getRequestDispatcher("path").forward(req,resp); //在Path中添加请求转发的url }
-
读取资源文件
java和resources俗称classes路径,可以读取写好的Properties资源文件
HttpServletResponse
- 发送数据
PrintWriter writer = resp.getWriter();
writer.print("HelloServlet");
- 下载文件
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件的路径
String realPath = "F:\\\\班级管理\\\\西开【19525】\\\\2、代码\\\\JavaWeb\\\\javaweb-02-servlet\\\\response\\\\target\\\\classes\\\\秦疆.png";
System.out.println("下载文件的路径:"+realPath);
// 2. 下载的文件名是啥?
String fileName = realPath.substring(realPath.lastIndexOf("\\\\") + 1);
// 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名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. 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
-
验证码功能
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器3秒自动刷新一次; resp.setHeader("refresh","3"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D g = (Graphics2D) image.getGraphics(); //笔 //设置图片的背景颜色 g.setColor(Color.white); g.fillRect(0,0,80,20); //给图片写数据 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //起始的坐标 //请求用图片的方式打开 resp.setContentType("image/jpeg"); //让不浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片传给浏览器 ImageIO.write(image,"jpg", resp.getOutputStream()); }
-
重定向
resp.sendRedirect("path")
访问这个页面时,会跳转到path页面
小功能
页面刷新
resp.setHeader("refresh",3)
生成随机数
public static String makeNum(){ Random random = new Random(); //生成一个0-999999范围内的随机数 String num = random.nextInt(999999)+""; //创造一个可变字符串 StringBuffer s= new StringBuffer(); for(int i=0;i<6-num.length;i++){ //当生成位数不足6位时,自动补0 s.append("0"); } return s+num;}
重定向和转发的区别
相同点:页面都会实现跳转
不同点:请求转发url地址不改变,重定向则会改变url地址
HttpRequest
代表客户端的请求
过程:用户通过Http协议访问服务器,HTTP请求中的所有信息会封装到HttpRequest中,通过该对象的方法,获取客户端请求的信息
作用
获取参数请求转发
常用的两个方法
@Overrideprotected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException { //解决中文乱码问题 req. setcharacterEncoding("utf-8"); resp.setcharacterEncoding("utf-8"); //获取参数 String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbys = req.getParameterValues("hobbys"); System.out.println("=========="); //验证获取到的参数 System. out.println(username); System. out.println(password); System. out.println(Arrays.tostring(hobbys)); System. out.println("============"); system. out.println(req.getContextPath()); //请求转发 req.getRequestDispatcher("/success.jsp").forward(req,resp);}
会话
用户打开一个浏览器,访问web资源,最终关闭浏览的一个过程
保存会话的两个技巧
cookie
- 客户端技术(响应,请求)
-
用户通过servlet发起请求
-
服务器检查是否存在cookie(req.getCookies(),返回一个cookie对象)
-
创建cookie,将cookie通过resp.addCookie()响应给客户端
- 特点
- 一个Cookie只能保存一个信息,new Cookie(String str,String str),采用键值对的方式
- 一个web可以向浏览器发送多个cookie,最多存放20个
- Cookie大小限制为4kb
- 一般浏览器可以存储300个cookie
session
- 服务器技术,保存用户信息,将用户信息存放在session中
什么是session
服务器给每一个用户(浏览器)创建一个Session对象,并将唯一的sessionID通过cookie保存在客户端
session的应用场景
- 保存用户登录信息
- 保存网站常用信息(如实现购物车功能)
session的使用
//获取session对象 HttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Person("某某某",1));
//使用session中存放的对象HttpSession session = req.getSession();Person person = (Person) session.getAttribute("name");System.out.println(person.toString());
以上是关于Day21-Sevlet与会话的主要内容,如果未能解决你的问题,请参考以下文章