JAVA学习日记DAY09--javaweb的一些简单应用

ServletContext(只能从req中获取)

req.getServletContext

  1. 每一个maven做的module形成的类都是一个servlet,在配置tomcat时,保证.war只有一个,可以省时间。

  2. 为了对每个Servlet的数据做共享,所以有ServletContext,管理全部的servlet,进行数据共享。

(setAttribute) 、、(getAttribute)

///设置数据
ServletContext servletContext = req.getServletContext();
String name = "ljs";
servletContext.setAttribute("name",name);
得到数据
ServletContext servletContext = req.getServletContext();
String name = (String) servletContext.getAttribute("name");
resp.getWriter().print("name:" + name);
  1. 获取初始化参数(getInitParameter)
<context-param>
        <param-name>userparam-name>
        <param-value>rootparam-value>
context-param>
ServletContext servletContext = req.getServletContext();
resp.getWriter().print("user:" + servletContext.getInitParameter("user"));
  1. 请求转发(getRequestDispatcher)
ServletContext servletContext = req.getServletContext();
resp.getWriter().print("user:"+servletContext.getRequestDispatcher("/gp"));
  1. 读取资源文件(properties)----未实现

resources和java的文件都会被打包到target的calsses(类路径)。

maven中导出文件可能失败,在java里面的properties就不行,需要写等文件,在web.xml中。

资源文件需要通过转换流,getServletContext().getResourceAsStream然后由properties对象load(InputSteam)获取到,就可以进行其他的操作了。

HttpServletResponse

下载文件

  • outputStream 输出字节流
  • getWriter().print() 输出字符流
  • 下载文件
      1. 获取下载文件路径
      2. 下载的文件名
      3. 让浏览器能够支持下载我们所需要的东西
      4. 获取下载文件的输入流
      5. 创建缓冲区
      6. 获取OutputStream对象
      7. 将fileoutputStream写入到buffer
      8. 使用OutputStream将缓冲区的数据输出到客户端
public class ServResp extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        // 获取下载文件路径-----------1
        String path = "D:\\JAVA_project\\javaweb-01-maven\\servletresp\\src\\main\\resources\\image.jpeg";
        // 获取下载文件名-----------2
        String filename = path.substring(path.lastIndexOf("\\")+1);
        //设置浏览器支持我们需要下载的东西----3
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        //获取下载的文件输入流----------4
        FileInputStream fileInputStream = new FileInputStream(path);
        //创建缓存区---------5
        int len=0;
        byte[] buff = new byte[1024];
        //获取用于输出的对象----------6
        ServletOutputStream outputStream = resp.getOutputStream();
        //将输入传到缓存区,然后用上面的输出对象输出缓存区的内容---------7、8
        while ((len = fileInputStream.read(buff)) > 0){
            outputStream.write(buff,0,len);
        }
        fileInputStream.close();
        outputStream.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        doGet(req, resp);
    }
}

重定向

重定向:客户端A向服务器发送请求访问C,但是访问到了B,B返回C的URL给A,让A重新去找C

重定向与请求转发的区别:

​ 两者都会跳转页面,但是重定向的URL会改变,请求转发不会。

 resp.sendRedirect("/419/image");//重定向的路径为当前项目下的绝对路径,其中的image为映射的URL别名
//本质:
resp.setHeader("Location", "/419/image");
resp.setStatus(302);

简易的登录测试

JAVA学习日记DAY09--javaweb的一些简单应用_第1张图片

JAVA学习日记DAY09--javaweb的一些简单应用_第2张图片

${pageContext.request.contextPath}//表单的action路径获取
//获得前端表单的参数
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");

验证码

用网站显示一个即时刷新的数据

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //自动刷新
        resp.setHeader("refresh","3");
        //内存中创建图片
        BufferedImage bufferedImage = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = (Graphics2D)bufferedImage.getGraphics();
        //图片背景颜色
        graphics.setColor(Color.white);
        graphics.fillRect(0,0,80,20);
        //给图片数据
        graphics.setColor(Color.black);
        graphics.setFont(new Font("宋体",Font.BOLD,20));
        graphics.drawString(makeNum(), 0,20);
        //告诉浏览器,这个请求以图片形式打开
        resp.setContentType("image/jpg");
        //不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-control", "no-cache");
        resp.setHeader("Pragma", "no-cache");
        //写图片给浏览器
        ImageIO.write(bufferedImage, "jpg", resp.getOutputStream());


    }
    private String makeNum(){
        Random random = new Random();
        String i = random.nextInt(99999 ) + "";
        StringBuffer sb = new StringBuffer();
        for (int j = 0; j < 5 - i.length(); j++) {
            sb.append("0");
        }
        i = sb.toString() + i;
        return i;
    }

HttpServletRequest

传递多个参数,用getParameterVlues,会返回一个数组

JAVA学习日记DAY09--javaweb的一些简单应用_第3张图片
JAVA学习日记DAY09--javaweb的一些简单应用_第4张图片

这里通过Arrays.toString(array),进行输出

通过请求进行转发,而不是重定向,注意其使用路径的不同

req.getRequestDispatcher("success.jsp").forward(req,resp);

cookie–session

会话:用户打开一个浏览器,这个时候可以访问各种资源,然后关闭浏览器,这个过程就可以说是会话。

有状态会话:来过下次再来就有记录了

  • 客户端技术:服务端给客户端发一个信件(cookie),下次客户端带上这个就行了
  • 服务端技术:服务端登记客户端,给客户端一个sessionID,用此做唯一标识

cookie

  1. 从请求中拿到cookie
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//cookie可能有多个,是一个数组
cookie.getName();   //获得其中的key
cookie.getValue();   //获得其中的value
Cookie cookie = new Cookie("lastloginname", System.currentTimeMillis() + "");
cookie.setMaxage(___)  //设置过期时间
resp.addCookie(cookie);
//获得时间======
if (cookies != null){
    writer.write("上次访问的时间:");
    for (Cookie cookie : cookies) {
    	if(cookie.getName().equals("lastloginname")){    //和得到的键值比较
        	long lastTime = Long.parseLong(cookie.getValue());   ///解析得到的值
            Date date = new Date(lastTime);   //转换为Date类
            writer.write(date.toLocaleString());  //输出数据
         }
    }
}

如果中文输不出来的话,可以试试

URLEncoder.encode(“str”,“utf-8”); URLDecoder.decode(value,“utf-8”);

session(重点)

  • 服务器给每个浏览器创建一个session
  • 一个session独占一个浏览器,浏览器不关,一直存在
  • 用户登录后,整个网站都可以访问,即可以保存用户的信息

*** session不仅能存数据,还能存一个对象***

//session的本质
Cookie cookie = new Cookie("JSESSIONID",sessionid);
resp.addCookie(cookie);
//得到session和设置属性
HttpSession session = req.getSession();
session.setAttribute("name", new Person("李四", 29));
//得到属性
Person person = (Person) session.getAttribute("name");
//消除属性
session.removeAttribute("name");
//手动注销
session.invalidate();
//自动注销(web.xml)中配置
<!--自动注销,以分钟为单位-->
<session-config>
  <session-timeout>1</session-timeout>
</session-config>

session和cookie的区别

  • cookie是把用户的数据写给用户的浏览器,浏览器保存
  • session是把用户的数据写到用户独占的session中,服务器端保存
  • session对象由服务创建

JAVA学习日记DAY09--javaweb的一些简单应用_第5张图片

你可能感兴趣的:(学习日记,session,java,cookie,servlet,web)