Servlet是sun公司开发动态web的一门技术
Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
创建一个maven项目
创建一个子模块,子模块可以调用父项目的各种依赖
在子模块中创建一个HelloServlet类
编写映射
为什么需要映射?
我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
配置tomcat
开始测试
Tomcat包含web服务器和web容器
一个Servlet可以指定一个或者多个映射
特殊情况
/* 将该页面设置为首页 xx/*,访问xx开头任意结尾的页面
通配符存在优先级问题:指定了固定映射路径优先级最高,如果没有就使用默认的请求
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资源文件
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地址
代表客户端的请求
过程:用户通过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资源,最终关闭浏览的一个过程
用户通过servlet发起请求
服务器检查是否存在cookie(req.getCookies(),返回一个cookie对象)
创建cookie,将cookie通过resp.addCookie()响应给客户端
服务器给每一个用户(浏览器)创建一个Session对象,并将唯一的sessionID通过cookie保存在客户端
//获取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());