jstl和el与servletMVC实例

jstl在jsp的使用

  • 导入jstl.jar包添加头文件
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • jstl结合EL表达式:

    • 分支判断
      <p>分数:${score}</p>
      <c:if test="${score>=60}">
          <p style="color:green;">及格</p>
      </c:if>
      <c:if test="${score<60}">
          <p style="color:red;">不及格</p>
      </c:if>

 多分支

<c:choose>
    <c:when test="${score>=90}">
        <p>优秀</p>
    </c:when>
    <c:when test="${score>=80}">
        <p>良好</p>
    </c:when>
    <c:when test="${score>=70}">
        <p>中等</p>
    </c:when>
    <c:when test="${score>=60}">
        <p>合格</p>
    </c:when>
    <c:otherwise>
        <p>不合格</p>
    </c:otherwise>
</c:choose>

 循环

循环
  <ul>
      <c:forEach items="${list}"  var="emp">//传入的list集合
          <li>${emp.name}----${emp.gender}</li>
      </c:forEach>
  </ul>

 普通for循环

<c:forEach begin="1" end="10" step="1" var="i">
    <p>${i}</p>
</c:forEach>//this start with 1 ;var="i":this i is value

if判断


<c:if test="${score>=60}">
    <p style="color:green;">及格</p>
</c:if>

EL表达式: 

  • EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。用 ${ } 取代 <%=  %>
  • <h1>${result}</h1>//result可以用后台发送过来的数据;
    • String page = request.getParameter("page");//获取前端传递过来的值;前端的写法一般:${page} 
  • ${ }获取servlet的 request域的数据
    • request.setAttribute("list",empList);//将后台查询到的empList集合数据传给前端jsp页面 ; 以key:value的方式传递;前端可以以list做forEach输出到浏览器
    • 在request域中存储了一个名为"emptList"的对象,我们不需要通过${request.productList}取出相应的对象,只需要${empList}即可取出相应的对象。

JSTL:核心库

  • <c:if>标签:if判断

  • <c:forEach>标签  

  • <c:forEach items="${list}" var="emp">forEach

  • <c:choose> <c:when test="${score>=90}"> <p>优秀</p> </c:when> 

  • 都是双标签

综合项目;项目流程

  • 访问login 发送get请求给login servlet ;loginServlet通过request接收get请求;通过字符流获取到login.html的内容:
    response.getWriter().write(html);通过response返回给浏览器
  • 输入账号密码-->LoginServlet 的dopost方法:

loginServlet dopost请求,重定向到empList中:查询所有的员工 

 String contextPath = this.getServletContext().getContextPath();
            System.out.println("contextPath = " + contextPath);
            //1.使用重定向完成页面的跳转
            response.sendRedirect(contextPath +
 "/list?username=" +  username); //重定向到empListServlet中
  •  这种拼接字符串的方式是Get请求:为什么?用重定向不用转发?  重定向会把目标信息给浏览器,让浏览器完成页面跳转;如果用转发:由于转发发生在servlet浏览器没有跳转到list界面;只是把转发完的结果给了浏览器;浏览器url还是登录状态

重定向的写法:

  • response.sendRedirect(contextPath + "/list?username=" +  username);
    通过拼接url的方式访问listServlet   进入doget请求内:
    •  //1.通过三层从数据库中查询出所有的员工信息
      List<Employee> empList = service.findEmpList();
    • request.setAttribute("list",empList);//向前端页面jsp发送过去 key=list value=empList集合

 前端jsp页面

  • jsp接收servlet的request.setAttribute(,)转发的信息;通过forEach将request传过来的集合遍历输出

在list.jsp添加新功能

  • 删除
  • 点击删除按钮 弹窗:是否确认删除
  • 并且将获取到点击的当前emp的id传给 
    EmpRemoveServlet
  • 通过url传递get请求

    //1.从请求中获取删除的员工编号
     Integer id = Integer.parseInt(request.getParameter("id"));
     //2.调用service的方法进行员工删除的业务处理
     boolean flag= service.removeEmpById(id);
  • //3.根据业务结果进行响应
    if(flag){
        //重定向到/list
        response.sendRedirect(this.getServletContext().getContextPath() +  "/list");
       /web/list
  •  删除成功后再返回list 实现了数据更新;

  • 修改
  • <a>标签提交以get方式提交;访问流程:在访问到list界面后;点击修改:跳转到
    /web/edit?id=${emp.id}当前id  
  • 以get方式访问editServlet

    • //1.从请求中获取修改的员工编号
      Integer id=Integer.parseInt(request.getParameter("id"));
      //2.调用service根据id从数据库中查询出该员工的信息  返回一个对象
      Employee emp=service.findEmpById(id);
    • 将查询到的信息传给edit.jsp 为什么?因为做数据修改是在前端由用户动态做的;必须要有一次后台获取值-->将值显示到前端-->用户修改值-->保存到数据库 这样一个过程
      • edit的post处理前端的请求;
      • 通过post的request获取到前端提交的值,怎么获得的?:edit提交方式是form的post方式
        • <td>姓名</td>
          <td><input name="name" value="${emp.name}"></td>
        • 每个input都有一个name属性;edit.servlet获取到这些属性
          Integer id=Integer.parseInt(request.getParameter("id"));
          String name=request.getParameter("name");
          String gender = request.getParameter("gender");......
        • 把获取到的值给一个emp对象
          Employee emp=new Employee(id,name,gender,birth,deptid,null);
          //2。调用业务方法,传递一个员工对象保存到数据库
          boolean flag= service.saveEmpEdit(emp);
          
          //重定向到list页面刷新了list页面
          if(flag){
              resp.sendRedirect(this.getServletContext().getContextPath() + "/list");
  • 添加功能

    • <%--插入新员工--%>  <a href="${pageContext.request.contextPath}/add">添加</a>
    • 通过get请求跳转到add.servlet ;与更改相似 也是通过get请求获取到一个空对象
      Employee emp = new Employee(null,null,null,null,null,0);
    • 将其转发给addemp.jsp
      request.setAttribute("emp",emp);
      request.getRequestDispatcher("/WEB-INF/page/addemp.jsp")
      .forward(request,response);
    • 把前端输入的数据通过post提交给addemp.servlet
    • 同样的;添加成功返回到list 

模糊搜索

  • <form action="list" method="post"><input type="text" name="inputname"><input type="submit" value="搜索"></form>
  • 提交一个form表单;提交地址是list servlet 方式是post  name 标记是inputname     
  • post获取name 
    String inputname = req.getParameter("inputname");
  • 模糊查询
    List<Employee> empByname= nameService.queryNameService(inputname);//empByname是模糊查询集合
  •  发送给jsp显示
    req.setAttribute("empByname",empByname);
    //查询集合准备向前端发送
    req.getRequestDispatcher("/WEB-INF/page/queryByName.jsp").forward(req,resp);

分页功能

1.

tips:在实际的开发中,如果 servlet JSP 页面传递的数据比较多时,最后将这个分散的数
据封装成一个 JAVA 对象
  1. 分页的过程:
    1. 改写emplistServlet ;
String page = request.getParameter("page");
        //System.out.println("this page is"+page);
        Integer pageNum=1;
        if (page!=null){
            pageNum = Integer.parseInt(page);
            //System.out.println("current pageNum"+pageNum);
        }
        String size = request.getParameter("size");
        Integer pageSize=10;
        if (size!=null){
            pageSize = 10;
        }
 List<Employee> employeeList= service.findEmpByPage(pageNum,pageSize);
        //分页
        request.setAttribute("list",empList);

        request.setAttribute("employeeList",employeeList);
        //向jsp传递页码
            long total = service.findEmpCount();

将数据库查询到的所有员工通过一页十个数据;将总页码传给list.jsp进行遍历输出

将数据传递给jsp

 request.setAttribute("nextpage",pageNum+1);//下一页
        request.setAttribute("prevpage",pageNum-1);//上一页
        request.setAttribute("currentPage",pageNum);//当前页
        request.setAttribute("pageSize",pageSize);//每页个数
       request.setAttribute("pageCount",total);//总页数
        //此处必须用转发,否则jsp获取不到request中的业务结果
        request.getRequestDispatcher("/WEB-INF/page/list.jsp").forward(request,response);

jsp页面插入的数据;在table表格下插入 

<c:if test="${currentPage!=1}">
<a href="${pageContext.request.contextPath}/list?page=${prevpage}&size=${pageSize}">上一页</a>
</c:if>
<%--上一页 判断是否还有上一页--%>
<%--遍历出来的页码--%>
<c:forEach begin="1" end="${pageCount}" step="1" var="pageIndex">
    <a <c:if  test="${pageIndex==currentPage}">class="current"</c:if>
href="${pageContext.request.contextPath}/list?page=${pageIndex}">${pageIndex} </a>
 </c:forEach>
<%--下一页 判断是否还有下一页--%>
<c:if test="${pageIndex!=pageCount-1}">
<a href="${pageContext.request.contextPath}/list?page=${nextpage}&size">下一页</a>
</c:if>

当jsp页面点击页码时:

href="${pageContext.request.contextPath}/list?page=${pageIndex}

1.将提交到list servlet 当前页码是 pageIndex ?为什么:这是循环遍历的1 2 3 4 5中一个下标;

将这个下标以url方式提交给list get 方法 

String page = request.getParameter("page");

2.将获取到的page赋值给pageNum    和

Integer pageSize=10;//每一页显示的个数

3传入查询方法

List<Employee> employeeList= service.findEmpByPage(pageNum,pageSize);

4将其setAttribute到jsp页面去 每一页最多输出10个

5 上一页和下一页功能

  • <c:if test="${currentPage!=1}">
    <a href="${pageContext.request.contextPath}/list?page=${prevpage}&size=${pageSize}">上一页</a>
    </c:if>
  • 当前页不是第一页才有上一页;点击上一页将上一页prevpage就是(pageNum-1) 和pageSize传到listservlet里去 再循环一次get将值转发到前端页面。下一页同理

session和cookie

  • cookie
    //            登录的凭证 1.创建一个cookie(key,value)对象
    //            Cookie loginCookie = new Cookie("loginFlag","success");
    //            loginCookie.setMaxAge(30);//30s的存活期
    //            response.addCookie(loginCookie);
    //带了一个证明转发走了

设置loginCookie 的值:key:loginFlag   ;   value : success

  • 将loginCookie重定向到list
   //证明发送过来了
//        Cookie[] cookies = request.getCookies();//获取login传过来的;可以有多个证明
//
//        Cookie target = null;
//        for (Cookie cookie: cookies
//             ) {
//            if (cookie.getName().equals("loginFlag")){
//                target=cookie;//将获取到的cookie给target
//                break;
//            }
//        }

判断一下;如果loginFlag 对应的 value 是 success 才能 继续向下执行

if (target!=null&& target.getValue().equals("success")){

request.....

是以响应头的方式发送给浏览器

 cookie:安全问题

  • cookie保存在当前的浏览器内存;其他浏览器无法访问cookie;在浏览器关闭时清除  ;cookie保存到用户手里;有很大的安全隐患 
  • 设置cookie存在时间: loginCookie.setMaxAge(30);

模拟:session的方式

  • session:将是否登录成功信息保存到服务器上; session(key,value)保存到服务器;将key发给前端jsp
  • //loginservlet:  SessionManager sessionManager = new SessionManager();
                //;算出一个全球唯一的编号
    //            String sessionId = UUID.randomUUID().toString();
    //            sessionManager.sessions.put(sessionId,"loginSuccess");
                //保存到服务器
                //将session以cookie方式发送给客户端
    //            Cookie cookie = new Cookie("sessionId",sessionId);  //response.addCookie(cookie);
  • get到listservlet中
    • //_______________-初始版本从session读取值------------------------------
      //        Cookie[] cookies = request.getCookies();//获取login传过来的;可以有多个证明
       //       Cookie target = null;
      //        for (Cookie cookie: cookies
      //             ) {
      //            if (cookie.getName().equals("sessionId")){
      //                target=cookie;//将获取到的cookie给target
      //                break;
      //            }
      //        }
      //        if (target!=null&& target.getValue().equals("loginSuccess")){ //判断当前sessionId的值是否与servlet的对应
      //改写: if (target!=null&& SessionManager.session.get(target.getValue()).equals("loginSuccess")){
      

 

服务器写好的session方式 

  • session本质是一块服务器内存;
  • session所占内存与每个客户端相对应
  • session也是一个域数据;可以用setAttribute  和getAttribute

loginservlet://tomcat session的方式-----------------------------------------
HttpSession session = request.getSession();//获取当前客户在服务器上的session
//  通过请求拿到sessionId 服务器通过id查到对应session通过 request 获取到session
session.setAttribute("loginFlag","success");//往session存放数据、、是一个集合;可以有多个值
// response.sendRedirect(contextPath + "/list?username=" +  username); //重定向到empListServlet中
//_______________________________________________________________________________

listservlet:

        HttpSession session = request.getSession();//拿到loginsession;
//放在request域中是应为第一次访问post请求会让服务器创建一个session;之后只要浏览器不退出;而且没有超过session的生存时间;而且服务器没有关闭;都能通过cookie的key访问到这个session 的value
        Object loginFlag = session.getAttribute("sessionId");//只要拿到了sessionId 就可以直接登录了
        //  if (target!=null&& target.getValue().equals("success")){
        // if (loginFlag!=null&&  //"loginSuccess".equals(sessionManager.sessions.get(target.getValue()))){
        if (loginFlag!=null){//是否获取到session了??
        //___________登录___________________________________

 TomcatSession原理

  • session是依赖cookie的 cookie是客户端文本文件;session在服务器
  • session内存什么时候创建呢?
    • 客户端第一次获取session时才会创建;一个用户只会有一个session  
    • 第二个用户访问时会生成一个新的session
  • session内存什么时候销毁?
    • 有一个默认的生存时间:30分钟;配置在tomcat conf 的 web.xml 里;可以在自己的web.xml里更改 这个time 是动态的 只要刷新了提交申请 就会重置为30分钟
  • 服务器怎么区分每一块session内存与客户端之间的对应关系?
    • session依赖客户端的cookie保存的 key (sessionId)   客户端每次请求session都会把cookie的key携带给服务器;然后服务器进行识别
    • HttpSession session = request.getSession();//为什么是request域???
      • 先从请求的cookie 中获取sessonId ;然后服务器再根据sessionId去找对应的session
      • 第一次访问肯定是找不到的;所以服务器在你第一次访问时会创建一个session

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值