Servlet

Http协议

概述

HTTP 协议(Hypertext Transfer Protocol, 超⽂本传输协议),是⼀个客户端请求和响应的标准协
议,这个协议详细规定了浏览器和万维⽹服务器之间互相通信的规则。⽤户输⼊地址和端⼝号之后就可
以从服务器上取得所需要的⽹⻚信息。

浏览器中的书写格式

在这里插入图片描述

HTTP协议的特点

  1. ⽀持客户/服务器模式。
  2. 简单快速
  3. 灵活
  4. ⽆连接
  5. ⽆状态

Servlet

创建一个基本的Servlet类

1:创建一个类继承HttpServlet
2:重写service方法
3:设置注解
示例

@WebServlet("/myservlet2")
public class MyServlet2   extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应编码格式
        resp.setContentType("text/html;charset=UTF-8");
      /* resp.getWriter().write("hahah ");*/

        resp.sendRedirect("http://www.baidu.com");
    }
}

Servlet的⼯作流程

  1. 通过请求头获知浏览器访问的是哪个主机
  2. 再通过请求⾏获取访问的是哪个⼀个web应⽤
  3. 再通过请求⾏中的请求路径获知访问的是哪个资源
  4. 通过获取的资源路径在配置中匹配到真实的路径,
  5. 服务器会创建servlet对象,(如果是第⼀次访问时,创建servlet实例,并调⽤init⽅法进⾏初始化
    操作)
  6. 调⽤service(request, response)⽅法来处理请求和响应的操作
  7. 调⽤service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给
    浏览器

Servlet的⽣命周期

servlet 类加载–>实例化–>服务–>销毁。

HttpServletRequest对象

常用方法

           1. 获取请求的方式 (GET|POST等)
           2. 获取请求的完整路径 (从http开始,到?结束)
           3. 获取请求的部分路径 (从项目路径开始,到?结束)
           4. 获取请求的参数字符串 (从?开始,到最后)
          5. 获取请求的协议版本
           6. 获取项目的访问路径 (站点名)

     
        System.out.println(request.getMethod());
        System.out.println(request.getRequestURL());
        System.out.println(request.getRequestURI());
        System.out.println(request.getQueryString());
        System.out.println(request.getProtocol());
        System.out.println(request.getContextPath());

获取请求的参数

      获取请求的参数
       1. 获取指定参数名的参数值
           request.getParameter("参数名")
           注:
             1. 表单提交
                  参数名表示的是表单元素的name属性值
               2. 地址栏输入
                  参数名表示的是"?键=值&键=值"中的键
              2. 获取指定参数名的所有参数值
          request.getParameterValue("参数名")
        // 获取指定参数
        String uname = request.getParameter("userName");
        System.out.println("姓名:" + uname);
        String upwd = request.getParameter("userPwd");
        System.out.println("密码:" + upwd);

请求转发

 if (uname.equals("admin") && upwd.equals("admin")) {

            /**
             * 设置请求域:设置数据存放在作用域中,让客户端能够获取数据
             */
            request.setAttribute("userName",uname);
            /**
             * 请求转发
             */
            request.getRequestDispatcher("index.jsp").forward(request,response);
        } else {

            /**
             * 设置请求域:设置数据存放在作用域中,让客户端能够获取数据
             */
            request.setAttribute("msg","姓名或密码不正确!");
            /**
             * 请求转发
             */
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }

HttpServletResponse对象

响应数据

getWriter() 获取字符流(只能响应回字符)
getOutputStream() 获取字节流(能响应⼀切数据)

// 字符输出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");
// 字节输出流
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());

响应乱码问题

设置响应编码格式

//设置响应编码格式
        resp.setContentType("text/html;charset=UTF-8");

重定向

示例代码

   // 重定向
        response.sendRedirect("http://www.baidu.com");

重定向与请求转发的区别

重定向

  •  一种跳转方式。
    
  •  由服务端指导的客户端跳转。
    
  •  1. 客户端跳转。
    
  •  2. 地址栏会发生改变
    
  •  3. 存在两次请求
    
  •  4. request数据不能共享
    

请求转发

  • 一种跳转方式。
    
  • 1. 服务端跳转。
    
  • 2. 地址栏不会发生改变
    
  • 3. 只有一次请求
    
  • 4. 数据可以共享
    

    请求转发只能跳转到当前站点名下的资源,不可以跨域。重定向可以跳转到任意资源。

Cookie对象

概述

Cookie是浏览器提供的⼀种技术,通过服务器的程序能将⼀些只须保存在客户端,或者在客户端进⾏
处理的数据,放在本地的计算机上,不需要通过⽹络传输,因⽽提⾼⽹⻚处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常⻅的记住密码则可以通过 Cookie 来实现。

Cookie对象的创建和发送

创建以及发送的示例代码

        // 得到Cookie对象
        Cookie cookie = new Cookie("name","admin");
        // 发送cookie(将cookie对象响应给客户端)
        response.addCookie(cookie);

Cookie对象的获取

示例代码

// 获取所有的Cookie对象
        Cookie[] cookies = request.getCookies();

Cookie设置到期时间

Cookie的失效时间

  •  cookie默认是关闭浏览器失效(与服务器是否关闭无关)
    
  •  通过maxAge设置cookie的失效时间
    
  •  1. 正整数
        表示cookie存活指定秒数。
    
  •  2. 负整数
       表示cookie只在浏览器中存活,浏览器关闭即失效.默  认值是-1
    
  •  3. 零
       表示删除cookie
    

示例


        // 得到Cookie对象
        Cookie cookie = new Cookie("uname1","zhangsan");
        // 设置7天失效
        cookie.setMaxAge(7*24*60*60);
        // 发送cookie(将cookie对象响应给客户端)
        response.addCookie(cookie);

HttpSession对象

   1. Session对象的获取
       request.getSession();
       如果session对象存在,则直接获取;如果session对象不存在,则新建session
   2. JSESSIONID标识符
       当请求到达服务器时,如果使用了session,服务器会去获取一个JSESSIONID的cookie对象
       如果cookie对象不存在,则新建session对象,并设置sessionId,将sessionId回传给客户端中,设置对应的cookie
      如果cookie对象存在,服务器会比较客户端传递的sessionID是否与服务端的一致
           如果不一致,新建session对象,并设置sessionId,将sessionId回传给客户端中,重新设置对应的cookie
           如果一致,则获取到当前session对象
       Session底层是依赖cookie的,默认关闭浏览器失效。
   3. session作用域
       在一次会话有效,可以有多次请求和响应,在会话中数据共享。
       setAttribute()
       getAttribute()
       removeAttribute()

       request作用域
           一次请求中有效,在请求转发中有效,在重定向失效
       session作用域
           一次会话中有效,无论请求转发还是重定向都有效,会话销毁则失效

  4. session的销毁
       1. 关闭服务器
       2. 关闭浏览器
           session底层依赖cookie,cookie默认只在浏览器中存活,浏览器关闭则失效
       3. 默认最大不活动时间
            当指定时间内没有任何操作,则session对象失效;在时间未到达之前有操作,则会重新计时
           服务器中设定了session的最大不活动时间,Tomcat服务器设置的是30分钟
           在Tomcat的解压目录的conf中web.xml配置文件中
               <!-- session 默认的最大不活动时间。单位:分钟。 -->
               <session-config>
                    <session-timeout>30</session-timeout>
               </session-config>
       4. 手动设置失效时间
           通过session.setMaxInactiveInterval(int) 来设定 session 的最大不活动时间,单位为秒。
           通过getMaxInactiveInterval()方法获取当前最大不活动时间
       5. 手动销毁
          session.invalidate();
// 获取session对象
        HttpSession session = req.getSession();

        /**
         * 常用方法
         */
        System.out.println("SessionId:" + session.getId());
        System.out.println("会话创建时间:" + session.getCreationTime());
        System.out.println("最后一次访问时间:" + session.getLastAccessedTime());
        System.out.println("是否是新的对象:" + session.isNew());


        /**
         * 设置作用域
         */
        // 设置request作用域
        req.setAttribute("name","request");
        // 设置session作用域
        session.setAttribute("name2","session");



        /**
         * session的销毁
         */
        // 获取最大不活动时间
        int sec = session.getMaxInactiveInterval();
        System.out.println("最大不活动时间:" + sec);
        // 设置最大不活动时间
        session.setMaxInactiveInterval(20); // 20秒失效

        // 手动销毁
        session.invalidate();

ServletContext对象

ServletContext对象的获取

1:通过request对象获取
2:通过session对象获取
3:通过servletConfig对象获取
4:直接获取

示例代码以及常用方法的代码

/**
         * ServletContext对象的获取
         */
        // 通过request对象
        ServletContext servletContext = req.getServletContext();
        // 通过session对象获取
        ServletContext servletContext1 = req.getSession().getServletContext();
        // 通过servletConfig对象
        ServletContext servletContext2 = getServletConfig().getServletContext();
        // 直接获取
        ServletContext servletContext3 = getServletContext();


        /**
         * 常用方法
         */
        // 获取项目的真实路径
        String realPath = servletContext.getRealPath("/");
        System.out.println("获取项目的真实路径:" + realPath);
        // 获取服务器的版本信息
        String serverInfo = req.getServletContext().getServerInfo();
        System.out.println("获取服务器的版本信息:" + serverInfo);

        /**
         * servletContext作用域
         *      在整个应用程序中有效,服务器关闭失效
         *      setAttribute();
         *      getAttribute();
         *      removeAttribute();
         */

JSP

基本的语法

JSP
Java Server Page,Java Web端的动态资源,是动态页面。

        JSP的注释
            1. 显式注释 (在浏览器中审查元素或查看源代码可以看到的注释)
                1. 继承HTML风格
                <!-- HTML的注释 -->
            2. 隐式注释(在浏览器中审查元素或查看源代码不可以看到的注释)
                1. JSP自己的注释
                <%-- JSP注释 --% >
                2. 继承Java风格
                // 单行注释
                /* 多行注释 */

        Scriptlet脚本
            1. Java脚本段
                定义局部变量,编写语句。JSP生成的源码在编译后的Servlet类中的service方法体中
                <%

                %>
            2. 声明
                声明全局变量、方法、类等。JSP生成的源码在编译后的Servlet类体中
                <%!

                %>
            3. 输出
                输出变量或字面量。JSP生成的源码在编译后的Servlet类中的service方法体中
                <%= %>

静态包括

   静态包括
    <%@include file="要包含的文件的路径"%>

    特点:
        相当于将内容进行复制,只会生成一个jsp源码文件,不能出现同名变量。运行效率高一点点,但耦合度高,不够灵活。

代码示例

 <%@include file="head.jsp"%>
    <h2>主体内容</h2>
    <%@include file="foot.jsp"%>

动态包括

 动态包括
          <jsp:include page="要包含文件的路径"></jsp:include>

          特点:
            相当于方法的调用,会生成多个JSP的源码文件,可以定义同名变量。运行效率高,耦合度低。

          通过动态包含传递参数
          <jsp:include page="head.jsp">
            <jsp:param name="参数名" value="参数值"/>
          </jsp:include>


          注:
            1. 如果include动态包含没有参数需要传递,双标签中不要有任何内容,包括空格和回车
            2. 设置参数时,name属性不支持任何表达式,value属性支持表达式

示例代码

 <jsp:include page="head.jsp"></jsp:include>
    <h2>主体内容</h2>
    <jsp:include page="foot.jsp"></jsp:include>

    <%-- 通过动态包含传递参数 --%>
    <jsp:include page="head.jsp">
        <jsp:param name="uname" value="admin"/>
        <jsp:param name="upwd" value="<%=pwd%>"/>
    </jsp:include>

EL表达式

    语法:${限域变量名}
    一般操作的是域对象的值,无法操作变量。
    取值范围:从小到大范围,依次查找;如果找到,则显示;未找到,则往大范围找,如果都未找到,则显示空字符串。

    从小到大:page范围  -> request范围 -> session范围 -> application范围
    获取指定范围的值: pageScope、requestScope、sessionScope、applicationScope

    操作数据
        List
            大小:${限域变量名.size()}
            获取指定值:${限域变量名[下标]}
        Map
            获取指定值:${限域变量名.key} -- ${限域变量名["key"]}
        JavaBean
            给属性字段提供get方法
            ${限域变量名.属性字段名} -- ${限域变量名.get属性字段名()}

    empty为空判断 (空返回true;否则返回false)
        字符串:判断null和空字符串
        List:判断null和size
        JavaBean:判断null

    等值比较
        比较两个值是否相等,返回true或false
	    ==  或  eq
获取域对象:${uname} <br>
获取域对象:${userName} <br>
获取指定范围的域对象:${sessionScope.uname} <br>
获取变量:${str} <br>

<hr><br>
<h2>操作指定类型的数据</h2>
<%
    List<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("mylist", list);
%>
获取List的size:${mylist.size()} <br>
获取指定下标的值:${mylist[1]}<br>
<br>
<%
    Map map = new HashMap();
    map.put("aaa", "111");
    map.put("bbb", 2222);
    map.put("ccc-a", 333);
    request.setAttribute("map", map);
%>
获取Map的值:${map.aaa} -- ${map["bbb"]}<br>
<br>
<%
    User user = new User();
    user.setUserId(1);
    user.setUname("zhangsan");
    user.setUpwd("123456");
    request.setAttribute("user",user);
%>
获取JavaBean对象:${user} <br>
获取属性字段:${user.uname } -- ${user.getUpwd()} <br>

<br><hr>
<h4>empty</h4>
<%
    // 字符串
    String str1 = null;
    String str2 = "";
    String str3 = "test";
    request.setAttribute("str1",str1);
    request.setAttribute("str2",str2);
    request.setAttribute("str3",str3);
%>
${str1 == null || str1 == ""} -- ${str1 != null && str1 != ""} -- ${!empty str1}
<%-- 判断null与空字符串 --%>
${empty str1} -- ${empty str2} -- ${empty str3}
<br><br>
<%
    // List
    List list1 = null;
    List list2 = new ArrayList<>();
    List<String> list3 = new ArrayList<>();
    list3.add("ccc");
    request.setAttribute("list1", list1);
    request.setAttribute("list2", list2);
    request.setAttribute("list3", list3);
%>
<%-- 判断null和长度为0 --%>
${empty list1} -- ${empty list2} -- ${empty list3}
<br><br>
<%
    // JavaBean
    User user1 = null;
    User user2 = new User();
    User user3 = new User();
    user3.setUserId(1);

    request.setAttribute("user1",user1);
    request.setAttribute("user2",user2);
    request.setAttribute("user3",user3);
%>
<%-- 判断null --%>
${empty user1} -- ${empty user2} -- ${empty user3}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值