Servlet-JSP-EL-JSTL-BeanUtils-Cookie-Session

1. Servlet 生命周期的方法

以下方法都是由 Serlvet 容器负责调用. 
1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器. 
这说明 Serlvet 的单实例的!
2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet. 
3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的. 
4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源. 

2. Servlet的注册与运行

  • Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,通需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。
  • Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
  • 一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name><servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
  • 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name><url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
  • 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
  • 在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。(  *.do     /action/*)
  • load-on-startup: 可以指定 Serlvet 被创建的时机. 若为负数, 则在第一次请求时被创建.若为 0 或正数, 则在当前 WEB 应用被
    Serlvet 容器加载时创建实例, 且数组越小越早被创建. 

3. HttpServlet

  • HtppServlet是一个Servlet,继承自GenericServlet。针对于Http协议所定制;
  • 在service()方法中直接把ServletRequest和ServletResponse转为了HtttpServletRequest和HttpServletResponse;

4. JSP的九大内置对象

request   请求对象                                      response  响应对象

pageContext    jsp的上下文对象                 session    会话对象

application     ServletContext对象               config       ServletConfig对象

out             jsp输出流对象                            page     指向当前的jsp的对象

exception    异常对象

5. JSP的四大域对象

pageContext    当前jsp页面范围内有效                       request             一次请求内有效

session             一次会话范围内有效                           application       整个web工程范围内有效

6. EL表达式

  • EL表达式主要是在jsp页面中输出数据,主要是输出域对象中的数据
  • 当四个作用域中都有相同的key的数据时,按照从小到大顺序依次查找,pageContext<request<session<application

6.1 EL表达式的11个隐含对象

6.2 jsp的绝对路径  ${pageContext.request.contextPath}

比如:<script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script>

<a href="${pageContext.request.contextPath}/product-list.jsp">

6.3 一般使用

7. JSTL标签库

7.1 核心库

<!-- 有网的情况下 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 没网的情况下 这两个试一下,如果第一个不可,用第二个-->
<%@ taglib uri="/WEB-INF/tlds/c.tld" prefix="c"%>
<%@ taglib uri="/WEB-INF/tlds/c-rt.tld" prefix="c"%>
<%--
    <c:if />
    if 标签用来做 if 判断。
    test 属性表示判断的条件(使用 EL 表达式输出)
--%>
    <c:if test="${ 12 == 12 }">
        <h1>12 等于 12</h1>
    </c:if>
<%--
    <c:choose> <c:when> <c:otherwise> 标签
    作用:多路判断。跟 switch ... case .... default 非常接近
    choose 标签开始选择判断
    when 标签表示每一种判断情况
    test 属性表示当前这种判断情况的值
    otherwise 标签表示剩下的情况
    <c:choose> <c:when> <c:otherwise> 标签使用时需要注意的点:
    1 、标签里不能使用 html 注释,要使用 jsp 注释
    2 、 when 标签的父标签一定要是 choose 标签
--%>

    <c:choose>
        <c:when test="${ requestScope.height > 190 }">
            <h2>小巨人</h2>
        </c:when>
        <c:when test="${ requestScope.height > 180 }">
            <h2>很高</h2>
        </c:when>
        <c:when test="${ requestScope.height > 170 }">
            <h2>还可以</h2>
        </c:when>
        <c:otherwise>
            <c:choose>
                <c:when test="${requestScope.height > 160}">
                    <h3>大于 160</h3>
                </c:when>
                <c:when test="${requestScope.height > 150}">
                    <h3>大于 150</h3>
                </c:when>
                <c:when test="${requestScope.height > 140}">
                    <h3>大于 140</h3>
                </c:when>
                <c:otherwise>
                    其他小于 140
                </c:otherwise>
            </c:choose>
        </c:otherwise>
    </c:choose>
<%--
    遍历 1 到 10 ,输出
    begin 属性设置开始的索引
    end   属性设置结束的索引
    var   属性表示循环的变量 ( 也是当前正在遍历到的数据 )
    for (int i = 1; i < 10; i++)
--%>
<table border="1">
    <c:forEach begin="1" end="10" var="i">
        <tr>
            <td>第${i}行</td>
        </tr>
    </c:forEach>
</table>
<%-- 
    遍历 Object 数组或集合
    for (Object item: arr)
    items 表示遍历的数据源(遍历的集合或数组)
    var   表示当前遍历到的数据
--%>
<c:forEach items="${ requestScope.arr }" var="item">
    ${ item } <br>
</c:forEach>
<c:forEach items="${ requestScope.map }" var="entry">
    <h1>${entry.key} = ${entry.value}</h1>
</c:forEach>
<table>
    <tr>
        <th>编号</th>
        <th>用户名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>电话</th>
        <th>操作</th>
    </tr>
<%--
    items     表示遍历的集合
    var       表示遍历到的数据
    begin     表示遍历的开始索引值
    end       表示结束的索引值
    step      属性表示遍历的步长值
    varStatus 属性表示当前遍历到的数据的状态
        .current 当前数据
        .index   当前数据的索引
        .count   当前数据是第几个
        .step    获取遍历设置的步长
        .first   是否是第一个
        .last    是否是最后一个
        .begin   获取遍历设置的起始值
        .end     获取遍历设置的结束值
    for ( int i = 1; i < 10; i+=2 )
--%>
    <c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stuList}" var="stuItem">
        <tr>
            <td>${stuItem.id}</td>
            <td>${stuItem.username}</td>
            <td>${stuItem.password}</td>
            <td>${stuItem.age}</td>
            <td>${stuItem.phone}</td>
            <td>${status.index}</td>
        </tr>
    </c:forEach>
</table>

7.2 格式化库

<!-- 没网的情况下引入 如果第一个不可以,试下第二个-->
<%@ taglib uri="/WEB-INF/tlds/fmt.tld" prefix="fmt"%>
<%@ taglib uri="/WEB-INF/tlds/fmt-rt.tld" prefix="fmt"%>

<!-- 有网的情况下引入 -->
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!-- 格式化金额,比如123456.78,结果显示为123,456.78 -->
<fmt:formatNumber value="${result.amount}" pattern="#,###.00"/>

<!-- 格式化日期,结果显示为2020-09-05 -->
<fmt:formatDate value="${result.executeDate}" pattern="yyyy-MM-dd"/>

<!-- 格式化时间,结果显示为2020-09-05 10:04:12 -->
<fmt:formatDate value="${result.inputDate}" pattern="yyyy-MM-dd HH:mm:ss"/>

8. Servlet使用反射替代if-else

public class BaseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");
        try {
            //反射拿到方法,比如从页面传过来的action=login,则对应的方法就是login();如果是regist,则方法是regist()
            Method method = this.getClass()
                    .getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(this,request,response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

9. BeanUtils工具

public class WebUtils {
    public static <T> T copyParam2Bean(Map values, T bean) {
        System.out.println("before bean=" + bean);
        try {
            BeanUtils.populate(bean,values);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("after bean=" + bean);
        return bean;
    }
}

10. Cookie

  • Cookie是服务器通知客户端保存键值对的一种技术
  • Servlet发送到Web浏览器少量信息,这些信息由浏览器保存到Cookie,然后每次请求都会发送回服务器
  • 每个Cookie的大小不能超过4KB

11. Session

  • Session就是一个接口(HttpSession)
  • Session就是会话,用来维护一个客户端和服务器之间关联的一种技术
  • 每个客户端都有自己的一个Session会话
  • Session会话中,我们经常用来保存用户登录后的信息

11.1 Session设置超时时长的方法

//1. Session默认超时时长是1800秒,也就是30分钟。这是在tomcat的web.xml配置的

//2. 在工程的web.xml里面配置全局的session超时时长
<session-config>
    <session-timeout>60</session-timeout>
</session-config>

//3. 如果想单独给某个session设置超时时长,则调用session对应的api方法
    // 先获取Session对象
    HttpSession session = req.getSession();
    // 设置当前Session3秒后超时
    session.setMaxInactiveInterval(3);
    // 让Session会话马上超时,一般在销毁时调用,比如重新登录用户时
    session.invalidate();

11.2 Session在客户端与服务器之间的传递过程

  1. 浏览器在没有对应的Cookie发送请求时,服务器通过request.getSession()创建Session对象保存到服务器内存中,同时创建一个Cookie对象,Cookie对象的key永远是JSESSIONID,值是刚刚创建的session对象的ID值。然后服务器通过响应返回给客户端,浏览器解析数据创建一个Cookie对象;
  2. 浏览器有了这个Cookie对象后的每次请求,都会把session的id以Cookie的形式发送给服务器。此时服务器通过request.getSession()获取的是之前创建好的session并返回;
  3. 假如把浏览器的这个session对应的cookie删除掉,则再次请求时,服务器通过request.getSession()创建一个新的Session对象保存到服务器内存中,之前的那个session就没有了对应关联;

12. 验证码的使用

  • 表单提交完毕后,按F5刷新,表单会重复提交。解决方法:使用重定向来进行跳转
  • 用户提交到服务器,由于网络卡顿,用户迟迟未收到响应,用户多次点击提交造成重复提交,可以使用验证码解决
  • 用户提交到服务器,用户回退浏览器,然后再次提交造成重复,可以使用验证码解决

12.1 谷歌验证码Kaptcha的使用

  1. 导入kaptcha-2.3.2.jar
  2. 在web.xml配置映射
        <servlet>
                <servlet-name>KaptchaServlet</servlet-name>
            <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>KaptchaServlet</servlet-name>
            <url-pattern>/kaptchaServlet.jpg</url-pattern>
        </servlet-mapping>
  3. 在表单中使用img标签显示验证码图片
    <label>验证码:</label>
    <input class="itxt" name = "code" type="text" style="width: 90px;" id="code"/>
    <img id="code_img" src="kaptchaServlet.jpg" style="float: right; margin-right: 40px; width: 100px; height: 30px">
    
    
    
    $("#code_img").click(function () {
        this.src = "${basePath}/kaptchaServlet.jpg?d=" + new Date();
    })
  4. servlet中获取并比较
    String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
    request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
    String code = request.getParameter("code");
    if (token != null && token.equalsIgnoreCase(code)) {
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱梦君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值