1. JSP
什么是jsp:其实也是一个网页,从程序员角度看待,是一个java类,它继承了servlet,所以jsp就是一个servlet
为什么会有jsp:html多数情况下用来显示静态内容,但是有些时候,需要在网页上面显示动态的数据,比如查询所有的学生信息,或者根据姓名来查询某个学生,然后在网页上面显示,html是不支持java代码的,但是jsp里面可以写java代码。
如何使用jsp:
指令写法:
<%@ 指令名字 %>
Page指令:
language = "java":jsp页面中写java代码
contentType="text/html;charset=UTF-8":这是一个文本html页面
pageEncoding="UTF-8":jsp内容编码
extends="":用于指定jsp翻译成java文件继承的父类,一般不用修改
import = "":导包
session = "":值只能选择true或者false,用于控制在这个jsp界面中能否直接使用session对象
errorPage=“”:指的是错误的界面,当发生错误时,将显示错误界面的内容
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" errorPage="error.jsp"%> <body> <% int i = 10/0; %> </body>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true" %> <body> 出错了: <%=exception.toString() %> </body>
errorPage用于指定发生错误时跳转到哪个页面
isErrorPage用于说明这是一个errorPage界面
include指令
<%@ include file = "other.jsp"%>:插入一个页面
<%taglib prefix="" uri="" %>:uri:标签库路径 prefix:标签库的别名
JSP动作标签
jsp:param:意思是在包含某个页面的时候,或者跳转到某个页面时候,加入这个参数
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>jsp_action.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%-- <jsp:include page = ""></jsp:include> <jsp:param value = "" name = "" /> <jsp:forward page = ""></jap:forward> --%> 这是jsp——action的页面 <%-- 包含指定的页面,这里是动态包含,也就是不把包含页面所有元素的标签拿过来输出,而是把它的运行结果拿过来 --%> <%-- <jsp:include page = "login.jsp"></jsp:include> --%>、 <%-- 跳转到哪个界面,页面会直接显示cart.jsp的内容 --%> <%-- <jsp:forward page = "cart.jsp"></jsp:forward> --%> <%-- 等同于以下的代码 <% request.getRequestDispatcher("cart.jsp").forward(request, response); %> --%> <%-- jsp:param:在包含某个页面时候,或者跳转某个页面时候,带上这个参数 --%> <jsp:forward page = "login.jsp"> <jsp:param name = "address" value = "beijing" /> </jsp:forward> </body> </html>
调用方法:
<%= request.getParameter("address") %> 使用EL表达式 $(param.address); <%-- response.addCookie(new Cookie("name", "value"); $(cookie.name) --%>
JSP内置对象
所谓的内置对象,就是直接可以在jsp页面中直接使用这些对象
pageContext[PageContext]:作用域仅限于当前页面,重定向请求就没有了,可以通过get...()得到其它八个对象
request[HttpServletRequest]:作用域仅限于一次请求,只要服务器对该请求做出了响应,域中存的值就没有了。请求转发以后就没有了
session[HttpSession]:作用域限于一次会话,多次请求和响应,关闭浏览器重新打开转发的界面就没有了
application[ServletContext]:整个工程都可以访问,服务器关闭以后就不能访问了
以上四个是作用域对象
作用域:表示这些对象可以存值,取值范围有限定,setAttribute,getAttribute
<body> 使用作用域来存储对象<br /> <% pageContext.setAttribute("name", "pagecontext"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> <%= pageContext.getAttribute("name")%> <br /> <%= request.getAttribute("name")%> <br /> <%= session.getAttribute("name")%> <br /> <%= application.getAttribute("name")%> <br /> </body>
out[JspWriter]:
response[HttpServletResponse]:
exception[Threadable]:isErrorPage="true",才能使用这个对象
page[Object]:就是这个jsp翻译成java类的实例对象this
config[ServletConfig]:
<body> 使用作用域来存储对象<br /> <% pageContext.setAttribute("name", "pagecontext"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> <%= pageContext.getAttribute("name")%> <br /> <%= request.getAttribute("name")%> <br /> <%= session.getAttribute("name")%> <br /> <%= application.getAttribute("name")%> <br /> <% out.write("这是使用out对象输出的内容"); %> <% response.getWriter().write("这是response.getWrite的内容"); %> </body>
先输出response的内容,然后才是输出out的内容
2. EL表达式
1. 目的:为了简化jsp代码,具体一点就是为了简化在jsp里面写的那些java代码
2. 写法格式:${表达式}
3. 取值方式
如果这个值是带下标的,那么使用 内置对象名[]
如果没有下标,使用 内置对象名.属性 的方式去取
4. 隐式对象
<%@ page language="java" import="java.util.*,com.wang.servlet.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>jsp_class.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 使用作用域来存储对象<br /> <% /* pageContext.setAttribute("name", "pagecontext"); */ request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); String[] a = {"aa", "bb", "cc", "dd"}; pageContext.setAttribute("array", a); // 存放数组 List<String> list = new ArrayList<String>(); list.add("20151411"); list.add("20151412"); list.add("20151413"); list.add("20151414"); pageContext.setAttribute("list", list); // 存放arraylist集合,arraylist的底层是数组 Map<String, String> map =new HashMap<String, String>(); map.put("name", "wanging"); map.put("age", "wangun"); map.put("address", "xiaoa"); pageContext.setAttribute("map", map); // 存放Map集合 User user = new User("wang", 21); pageContext.setAttribute("use", user); // 存放对象 %> 使用jsp代码取值<br /> <%= pageContext.getAttribute("name")%> <br /> <%= request.getAttribute("name")%> <br /> <%= session.getAttribute("name")%> <br /> <%= application.getAttribute("name")%> <br /> 使用EL表达式取值<br /> ${ name } <br /> <!-- 先去pageContext找,再去request找,再去session找,再去application找,都找不到就不找了 --> ${ pageScope.name } <br /> <!-- 只到pageContext中找,如果找不到就不找了,返回"",不报错 --> ${ requestScope.name } <br /> ${ sessionScope.name } <br /> ${ applicationScope.name } <br /> ${ array[0] }, ${ array[1] }, ${ array[2] }, ${ array[3] } <br /> <!-- 取数组的元素 --> ${ list[0] }, ${ list[1] }, ${ list[2] }, ${ list[3] } <br /> <!-- 取arraylist集合的元素 --> ${ map.name }, ${ map.age }, ${ map.address } <br /> <!-- 取map集合的元素 --> ${ use.name }, ${ use.age } <!-- 对象方法中必须要有getName(),getAge(),这两个方法 --> </body> </html>
页面的输出结果
3. JSTL
全称:JSP Standard Tag Library: jsp标准标签库:简化jsp代码的编写,替换<%%>的写法,一般与EL表达式配合使用
使用:
1. 导入JSTL支持的jar文件jstl.jar 和 standard.jar,拷贝到WebRoot/web-INF/lib目录下
2. 在页面上使用tablib来引入标签库
3. 如果想支持EL表达式,则选择1.1版本,1.0不支持
<%@ page language="java" import="java.util.*,com.wang.servlet.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>jstl.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 常用的标签:指明一个对象name,存储到了page(默认),指定为session <br /> <c:set var="name" value="zhangsan" scope="session"></c:set> ${ sessionScope.name } <br /> <c:set var="age" value="18" ></c:set> 判断text里面的表达式是否满足,如果满足,就执行c:if标签中的输出,c:if是没有else的,可以加入var scope标签 <br /> <c:if test="${ age > 16 }" var = "flag" scope = "session">年龄大于了十六岁</c:if> <br /> <c:if test="${ age > 20 }">年龄大于了二十岁</c:if> <br /> ${ sessionScope.flag } 从begin开始遍历到end结束,得到的结果,赋值给i,会存储到page中,step表示增幅 <br /> <c:forEach begin = "1" end = "10" step = "2" var = "i"> ${ i } </c:forEach> <br /> <% List<User> list = new ArrayList<User>(); list.add(new User("张三", 13)); list.add(new User("李四", 14)); list.add(new User("王五", 15)); list.add(new User("赵六", 16)); pageContext.setAttribute("list", list); %> items:表示遍历哪一个对象,注意,这里必须填写EL表达式 <br /> value:遍历出来的每一个元素使用user去接收 <c:forEach var = "user" items = "${ list }"> ${user.name } ------ ${user.age } <br /> </c:forEach> </body> </html>
页面的输出结果:
学生信息管理系统:
1. 先写login.jsp,并且搭配一个LoginServlet去获取登陆信息
2. 创建用户表,里面只要有id,username和password
3. 创建UserDao,定义登录的方法
4. 创建UserDaoImpl,实现之前定义的登录方法
5. 在LoginServlet里面访问UserDao,判断登录结果,以区分对待
6. 创建stu_list.jsp,让登录成功的时候跳转过去
7. 创建学生表,里面定义相关学生的信息
8. 定义学生的StudentDao
9. 实现学生的StudentDaoImpl
10. 登录成功,完成以下的步骤:
a. 查询所有的学生
b. 把这些所有的学生集合存储到一个作用域中
c. 跳转到stu_list.jsp
11. 在stu_list.jsp中,取出域中的集合,然后使用c标签,去遍历集合
项目托管的地址:https://github.com/fenyying/StudentManage