Servlet

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");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jeu4nEuk-1627236174315)(C:\Users\Rumors74\AppData\Roaming\Typora\typora-user-images\image-20210724150601285.png)]

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;

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oDgupisi-1627236174317)(C:\Users\Rumors74\AppData\Roaming\Typora\typora-user-images\image-20210724214023248.png)]

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使用场景
    • 保存一个登录用户的信息;
    • 购物车信息;
    • 在整个网站中经常会使用的数据;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u91HZeOn-1627236174319)(C:\Users\Rumors74\AppData\Roaming\Typora\typora-user-images\image-20210724231831161.png)]

多个用户使用共享信息:ServletContext

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WT8JQJkN-1627236174320)(C:\Users\Rumors74\AppData\Roaming\Typora\typora-user-images\image-20210724232014255.png)]

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>

2.1MVC三层架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kR9Up6ou-1627236174321)(C:\Users\Rumors74\AppData\Roaming\Typora\typora-user-images\image-20210725012408569.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值