1.EL表达式

 目的:从作用域中取出共享数据
   ${p.属性名称}
  使用EL获取当前应用的上下文路径
      ${pageContext.getRequest().getContextPath()}
  判断集合是否为空:
       ${empty list}:表示判断List既不能等于null,并且有元素,才会返回false

2.JSTL标签(消除jsp中的java代码)

  拷贝jar包:jstl.jar   standard.jar
 <%@ taglib uri="" prefix=""%>
   常用标签库:
       判断语句标签:
         <c:if test="${num==10}">等于10</c:if>
       循环迭代标签:
         <c:forEach  items="${numList}" var="item">
        ${item}
     </c:forEach>
       日期格式化标签:
       <fmt:formatDate value="${d}" pattern="yyyy-MM-dd HH:mm:ss"/>

3.MVC思想

 Model1:jsp+javaBean(职责不分明)
 Model2:JSp+Servlet+JavaBean(责任分离)
 MVC:
     M:Model:数据模型对象(封装数据,处理业务逻辑):javaBean
 V:View :展示界面,显示数据
 C:控制器(接收所有请求和界面跳转):Servlet
      MVC框架:Struts2/SpringMVC

4.简单的购物车设计:

   1):使用Session来完成.把购物车对象存放于Session中.
      缺陷:浏览器关闭,session被销毁,购物车就消失了.
   2):可以使用Cookie完成.把购物车对象存储于Cookie中.
      缺陷:Cookie中的数据只能存在在当前电脑的当前浏览器中.
   3):Cookie+数据库.
       如果登录: 就直接把购物车对象信息存到到数据库中(持久化存储).
       没有登录: 先把数据存储在Cookie中,一旦登录,就直接吧Cookie中的数据同步到数据库中

5.验证码

  一次性验证码的主要目的就是为了限制人们利用工具软件暴力猜测密码
    1.将随机数据存储到Session中,用于和用户提交的随机码进行比对
2.将随机码绘制成图片通过Servlet响应到浏览器
  <%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
    function change(){
        var img = document.getElementById("randomCodeImg");
        img.src="/randomCode?"+new Date().getTime();
    }
</script>
<body>
    <h1>登录页面</h1>
    <div style="color: red">${errorMsg}</div>
    <form action="/login" method="post">
        用户:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        验证码:<input type="text" name="randomCode" size="5" maxlength="5">
        <img alt="" id="randomCodeImg" src="/randomCode" onclick="change()" style="cursor: pointer;" title="看不清,换一张"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

@WebServlet("/randomCode")
public class RandomCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    //生成随机数
    String randomCode = UUID.randomUUID().toString().substring(0, 5);

    //把随机数放进Session中
    req.getSession().setAttribute("RANDOMCODE_IN_SESSION", randomCode);

    //创建图片对象
    int width = 80;
    int height = 40;
    int imageType = BufferedImage.TYPE_INT_RGB;
    BufferedImage image = new BufferedImage(width, height, imageType);

    //画板
    Graphics g = image.getGraphics();
    g.setColor(Color.YELLOW);
    //绘制一个实心的矩形
    g.fillRect(1, 1, width - 2, height - 2);

    //把随机数画进图片中
    g.setColor(Color.BLACK);//设置随机数的颜色
    Font font = new Font("宋体", Font.BOLD + Font.ITALIC, 20);
    g.setFont(font);//设置随机数的字体和大小
    g.drawString(randomCode, 10, 28);
    //干扰线
    g.setColor(Color.GRAY);
    Random r = new Random();
    for (int i = 0; i < 100; i++) {
        g.fillRect(r.nextInt(width), r.nextInt(height), 1, 2);
    }

    //关闭
    g.dispose();
    //把图片对象以流的方式保存出去
    ImageIO.write(image, "jpg", resp.getOutputStream());
}

}

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //接受请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String randomCode = req.getParameter("randomCode");
    //先校验验证码是否正确
    //获取Sesion中的验证码
    String sessionInCode = (String)req.getSession().getAttribute("RANDOMCODE_IN_SESSION");
    if(!randomCode.equals(sessionInCode)){
        req.setAttribute("errorMsg", "亲,您输入验证码不正确");
        req.getRequestDispatcher("/randomcode/login.jsp").forward(req, resp);
        return;
    }
    //做其他的业务(验证账号密码)
    System.out.println("验证码验证通过,可以进行其他业务了");
}

}