1.Jsp:Java Server Page,Java服务器端页面。Jsp必须要依赖服务器容器才能运行。Jsp本质可以理 解是Servlet。Jsp作为前端页面显示,Servlet作为控制器。
2.jsp的工作原理图:
3.Jsp的组成部分:
3.1:静态页面:在jsp页面可以直接写html代码(包括css,js);
3.2:小脚本:<% Java代码 %>
eg:<!-- java的小脚本 -->
<%
System.out.println("这是一个Java小脚本");
%>
3.3:表达式:<%=输出内容 %>
eg:<!-- 表达式 -->
<%="当前日期:"+getDate(new Date()) %>
3.4:指令:<%@ %>导包,导入页面,指定页面的属性,导标签库。
3.5:声明(了解):用来声明一个方法。<%! %>
eg:<!-- 声明 -->
<%!
String getDate(Date d){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
return sdf.format(d);
}
%>
3.6:注释:
<!--html注释-->查看源码时html注释页面上看到
在小脚本可以用Java的//,/* */
<%-- Jsp注释 --%>查看源码时jsp注释页面上看不到
3.7:Jsp的九大内置对象(重点):服务器容器在第一次加载Jsp页面时就会创建这九大内置对 象,所以在Jsp中这九大内置对象可以直接用。
3.7.1:out(javax.servlet.jsp.JspWriter ):输出信息到浏览器页面
out.print()/write();
3.7.2:request(javax.servlet.http.ServletRequest):请求对象
getParameter(String name);//通过表单元素name属性名获得表单元素value属性值。
getParameterValues(String name);//通过表单元素name属性名获得表单元素的一组value 属性值。
setAttribute(String name, Object o);//按key-value方式将值存在一次请求范围内
getAttribute(String name);//按Key名获取请求范围内存的Value值。
removeAttribute(String name);//按Key名移除请求范围内存的一对Key-value对。
setCharacterEncoding(String env);//设置post方式请求的字符编码。
getCookies();//获取客户端所有的cookies信息。
getMethod();//获取客户端请求的方式,get/post/put
getSession();//获取当前Session对象
getServletContext();//获取application对象
getRequestDispatcher(String path).forward(ServletRequest request, ServletResponse response) ;//实现页面跳转的同时,将当次请求对应请求对象和响应传递过去。
3.7.3:response(javax.servlet.http.SrvletResponse):响应对象
getWriter() ;//获取out打印流对象
setCharacterEncoding(String charset);//设置响应的字符编码
setContentType(String type);//设置响应的内容类型
addCookie(Cookie cookie);//将信息以cookie的形式通过浏览器存储到客户端
sendRedirect(String location);//实现页面跳转,重定向
setHeader(String name, String value) ;//设置响应头部信息
3.7.4:session(avax.servlet.http.HttpSession):会话对象
getId();//获得当前会话的SeesionId
setAttribute(String name, Object value);//按Key-Value对方式存数据
getAttribute(String name);//通过Key名获得Value值
removeAttribute(String name);//通过Key删除Key-Value对
getServletContext();//获得application对象
setMaxInactiveInterval(int interval) ;//设置session最大非活动时间
在web.xml中,设置session有效期
<!-- 设置Session有效期 ,单位:分钟-->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
3.7.5:application(javax.servlet.ServletContext):应用程序对象(web应用对象)
application.setAttribute(String name, Object ob);//按Key-value存值
application.getAttribute(String name);//按Key取值
application.removeAttribute(String name);//按Key删除Key-value对
application.getRealPath(String path);//根据项目相对文件夹路径名获得真实路径
3.7.6:config(javax.servlet.ServletConfig):配置对象
config.getInitParameter(arg0);//通过名称获得初始化参数值
config.getServletContext();//获得application对象
3.7.7:exception(javax.lang.Throwable ):异常对象
3.7.8:page(javax.lang.Object):当前页面。
3.7.9:pageContext(javax.servlet.jsp.PageContext):页面上下文对象,通过它可以获取 JSP页面的另外八大内置对象
4.静态导入和动态导入:相同点:都可以导入页面,都可以实现页面的复用。
静态导入:<%@ include file="url" %>可以在当前页面导入另外一个页面,在编译时会将导入的 页面和当前的页面合成一个页面编译。
适用场景:要考虑导入的页面的加载时效性时,咱们就用静态导入。
动态导入:<jsp:include page="url" />可以在当前页面导入另外一个页面,在编译时先加载当前 碳再加载导入的页面。
适用场景:不考虑导入页面的加载时效性时,就用动态导入。
5.EL:表达式语言。可以直接从四大范围(page->request->session->application)取值。
作用:使页面的代码更简洁。可以自动进行类型转化。EL表达式中的值,不用判断,有值就显示,没值就不显示。
5.1:el的使用:
<%
//Page范围内的值
pageContext.setAttribute("k1", "张三");
//request范围内的值
request.setAttribute("k1", "李四");
//session范围内的值
session.setAttribute("k1", "王五");
//application范围内的值
application.setAttribute("k1", "赵六");
//对象的属性
Student stu=new Student("孙星", "11", "woman", Arrays.toString(new String[]{"sleep","eat"}), "hubei");
request.setAttribute("stu1", stu);
//集合中的值
ArrayList<Student> stulist1=new ArrayList<Student>();
stulist1.add(new Student("孙星2", "112", "woman", Arrays.toString(new String[]{"sleep","eat"}), "hubei"));
stulist1.add(new Student("孙星3", "113", "woman", Arrays.toString(new String[]{"sleep","eat"}), "hubei"));
request.setAttribute("stulist1", stulist1);
//map集合中的值
Map<String,String> hmap=new HashMap<String,String>();
hmap.put("a1", "小东");
hmap.put("a2", "小西");
request.setAttribute("hmap1", hmap);
//null值
request.setAttribute("b1", null);
%>
<h1>${k1 }</h1>
<h1>姓名:${stu1.uname },密码:${stu1.pwd }</h1>
<h2>list集合中的对象的姓名:${stulist1[1].uname }</h2>
<h1>map中的值:${hmap1["a1"] }</h1>
<!-- el可以用逻辑运算符 -->
<h1>判断一个值是否空值:${!empty b1 }</h1>
<!-- el可以用算术运算符 -->
<h1>el可以进行运算:${1+1 }</h1>
<!-- el可以用关系运算符:== eq, > gt,>= ge,< lt,<= le,!= -->
<h1>el进行三元运算:${b1 eq null?1:2 }</h1>
6.jstl:JSP标准标签库。一般用它作页面逻辑处理。
6.1:使用jstl的步骤:
6.1.1:导包:jstl.jar
6.1.2:导标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
6.2:标签:
6.2.1:通用标签(了解):set,out,remove
eg:<!-- jstl通用标签 -->
<c:set var="uname" value="小波" ></c:set>
${uname }<br/>
<c:out value="${uname }"></c:out><br/>
<c:remove var="uname"/>
${uname }<br/>
6.2.2:选择标签:if, choose
eg:<!-- jstl选择标签 -->
<c:if test="${1<2 }">
<h1>1小于2</h1>
</c:if>
<c:set var="score" value="80"></c:set>
<h1>
<c:choose>
<c:when test="${score>90 }">A</c:when>
<c:when test="${score>80 }">B</c:when>
<c:otherwise>c</c:otherwise>
</c:choose>
</h1>
6.2.3: 循环标签:forEach
eg:<!-- 循环结构 -->
<!-- for循环的使用 -->
<c:forEach var="i" begin="1" end="10" step="1">
<h2>${i }</h2>
</c:forEach>
<!-- forEach循环使用 -->
<%
//集合中的值
ArrayList<Student> stulist1=new ArrayList<Student>();
stulist1.add(new Student("孙星2", "112", "woman", Arrays.toString(new String[]{"sleep","eat"}), "hubei"));
stulist1.add(new Student("孙星3", "113", "woman", Arrays.toString(new String[]{"sleep","eat"}), "hubei"));
request.setAttribute("stulist1", stulist1);
%>
<c:forEach var="s" items="${stulist1 }" varStatus="status">
<h2>遍历的每个元素的姓名属性:${s.uname },元素索引:${status.index }</h2>
</c:forEach>
7.扩展标签库:
7.1:格式化标签库:<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
eg:<!-- 格式化时间 -->
<h1><fmt:formatDate value="<%=new Date() %>" pattern="yyyy-MM-dd"/></h1>
<!-- 格式化数字 -->
<h1><fmt:formatNumber value="1.233434445" pattern="0.00"></fmt:formatNumber</h1>
<h1><fmt:formatNumber value="0.454545" pattern="0.00%"></fmt:formatNumber></h1>
7.2: 函数标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!-- 函数标签库 -->
<h1>函数标签库contains: ${fn:contains("abcderefef","uu") }</h1>
<h1>${fn:substring("abcdefg",2,5) }</h1>