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.
- 分页的过程:
- 改写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