JavaWeb学习之动态页面技术(JSP/EL/JSTL)
Posted 低调的小孩儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习之动态页面技术(JSP/EL/JSTL)相关的知识,希望对你有一定的参考价值。
JSP技术
1、jsp脚本和注释
jsp脚本:
1、<% java代码%> 内部的Java代码翻译到service方法的内部
2、<%=java 变量或表达式%> 会被翻译成service方法内部out.print()
3、<%! java 代码%> 会被翻译成servlet的成员(成员变量或者成员方法)的内容
jsp注释:不同的注释可见范围是不同的
1、html注释:<!--注释内容--> 可见范围有jsp源码、翻译后的servlet、页面显示Html源码
2、Java注释://单行注释 /*多行注释*/ 可见范围jsp源码、翻译后的servlet
3、jsp注释:<%注释内容%> 可见范围jsp源码可见
2、jsp运行原理----jsp的本质就是servlet
jsp在第一次被访问时会被web容器翻译成servlet,再执行
过程:第一次访问---->helloServlet.jsp----->helloServlet_jsp.java---->编译运行
注:被翻译后的servlet在Tomcat的work目录中可以找到
3、jsp的三大指令、九大内置对象
jsp的指令是指导jsp翻译和运行的命令
1、page指令-----属性最多的指令(在实际开发中page指令默认),根据不同的属性,指导整个页面的特性
格式:<%@page 属性名1=“属性值1” 属性名2=“属性值2”...%>
常用属性如下:
language:jsp脚本中可以嵌入的语言种类
pageEncoding:当前jsp文件的本身编码--内部可以包括contentType
contentType:response.setContentType("text/html;charset=UTF-8");
session:是否jsp在翻译时自动创建session
import:导入Java的包
errorPage:当 当前页面出错后跳转到哪个页面 (一般是发生500错误,当然状态码也可以认为的设置)
isErrorPage:当前页面是一个处理错误的页面
例如: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" import="java.util.ArrayList" errorPage="error.jsp"%>
2、include指令-----页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file="被包含的文件地址"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="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> <body> <%@include file="/header.jsp"%> <h1>这是内容部分</h1> <%@include file="/footer.jsp"%> </body> </html>
3、taglib指令-----在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:<%@taglib uri="标签库地址" prefix="前缀"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
jsp的内置/隐式对象(9个)
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,可以在jsp脚本中可以直接使用这9个对象
名称 |
类型 |
描述 |
out |
javax.servlet.jsp.JspWriter |
用于页面输出 |
request |
javax.servlet.http.HttpServletRequest |
得到用户请求信息, |
response |
javax.servlet.http.HttpServletResponse |
服务器向客户端的回应信息 |
config |
javax.servlet.ServletConfig |
服务器配置,可以取得初始化参数 |
session |
javax.servlet.http.HttpSession |
用来保存用户的信息 |
application |
javax.servlet.ServletContext |
所有用户的共享信息 |
page |
java.lang.Object |
指当前页面转换后的Servlet类的实例(在普通类中的this) |
pageContext |
javax.servlet.jsp.PageContext |
JSP的页面容器 |
exception |
java.lang.Throwable |
表示JSP页面所发生的异常,在错误页中才起作用 |
(1)out对象
out的类型:JspWriter
out作用就是想客户输出内容-----out.write()
out缓冲区默认8Kb 可以设置为0,代表关闭out缓冲区,内容会被直接写到response缓冲区中。
<%out.write("aaa");%>
<%out.write("bbb"); %>
<%response.getWriter().write("asd"); %>
<%out.write("ddd"); %>
上述代码的执行过程:当执行out.write();服务器会将里面的aaa、bbb、ddd存入out缓冲区中,执行response.getWriter().writer()时服务器会将里面的asd存入response缓冲区中,最后将out缓冲区中的内容刷到response缓冲区中,由于asd先进入缓冲区,所以最终结果为:asd、aaa、bbb、ddd
如果将buffer设置为0Kb,则关闭out缓冲区,out.write()里面的数据找不out到缓冲区,会默认存到response缓冲区中。最后的结果应为:aaa、bbb、asd、ddd
(2)pageContext对象----是一个域对象
jsp页面的上下文对象,page对象是设置页面属性的,例如导包、设置语言、数据编码格式等,与pageContext对象不是一回事
pageContext同样拥有域对象的三个方法
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttribute(String name)
pageContext可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "zhangsan"); %> <% pageContext.setAttribute("name", "lisi", pageContext.REQUEST_SCOPE); %> <% pageContext.setAttribute("name", "wangwu", pageContext.SESSION_SCOPE); %> <% pageContext.setAttribute("name", "xiaohong", pageContext.APPLICATION_SCOPE); %> <%=pageContext.getAttribute("name", pageContext.REQUEST_SCOPE)%> <% String name = (String) pageContext.getAttribute("name"); %> <%=name%> <%=pageContext.findAttribute("name")%> </body> </html>
findAttribute(String name)
依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不再向后寻找
四大作用域的总结:
page域:当前jsp页面范围
request域:一次请求
session域:一次会话
application域:整个web应用
可以获得其他8大隐式对象
例如: pageContext.getRequest()
pageContext.getSession()
jsp标签(动作)
1)页面包含(动态包含):<jsp:include page="被包含的页面"/>
2)请求转发:<jsp:forward page="要转发的资源" />
静态包含与动态包含的区别?
静态包含,底层源码只生成一个Java文件
动态包含,有几个jsp,底层源码就会生成几个Java文件
二者执行效果一样。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>include1</h1>
<!--静态包含与动态包含--> <!-- <jsp:include page="/include2.jsp"></jsp:include> --> <%request.setAttribute("name", "zhangsna"); %> <jsp:forward page="/include2.jsp"/> </body> </html>
EL技术
1.EL 表达式
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL 出现的目的是要替代jsp页面中脚本的编写。
2、从域中取出数据(掌握)
例如:jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代:${requestScope.name}
EL技术重要的就是从四大域中取数据,格式:${EL表达式}
获取pageContext域中的数据:${pageScope.key}
获得request域中的数据:${requestScope.key}
获得session域中的数据:${sessionScope.key}
获得application域中的数据:${applicationScope.key}
EL从四个域中获得某个值${key};
---同样是依次从pageContext域,request域,session域,application域中 获取属性,在某个域中获取后将不在向后寻找
<%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="com.oracle.demo01.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="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> <body> <%--向域中存数据 --%> <% pageContext.setAttribute("aaa", "bbb"); request.setAttribute("name", "张三"); User u = new User(); u.setId(1); u.setName("lisi"); u.setPwd("123"); session.setAttribute("user", u); List<User> list = new ArrayList<User>(); User u1 = new User(); u1.setId(1); u1.setName("wangwu"); u1.setPwd("456"); list.add(u1); User u2 = new User(); u2.setId(1); u2.setName("wangwu"); u2.setPwd("456"); list.add(u2); application.setAttribute("List", list); %> <%--使用jsp脚本取值 --%> <%=request.getAttribute("name") %> <hr> <%--使用EL表达式从域中取值 --%> ${requestScope.name } ${sessionScope.user.id } ${sessionScope.user.name } ${applicationScope.List[0].name } ${pageScope.aaa } </body> </html>
EL的11个内置对象
获得JSP域中的数据:pageScope、requestScope、sessionScope、applicationScope
接收参数:param、paramValues 相当于request.getParameter()、request.getParameterValues()
获取请求头信息:header、headerValues 相当于request.getHeader(name)
获取全局初始化参数:initParam 相当于this.getServletContext().getInitParameter(name)
WEB开发中的cookie:cookie 相当于request.getCookies()--cookie.getName()---cookie.getValue()
pageContext- WEB开发中的pageContext.
pageContext获得其他八大对象
${pageContext.request.contextPath} 获得web应用的名称 相当于 <%=pageContext.getRequest().getContextPath%> 这句代码不能实现
EL执行表达式
例如:
${1+1}
${empty user}
${user==null?true:false}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="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> <body> <%--获取请求的参数 --%> ${param.name } ${header["User-Agent"] } ${cookie.goods.name } ${cookie.goods.value } ${pageContext.request.contextPath} ${1+1} ${empty user} ${user==null?true:false} </body> </html>
JSTL技术
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库Core
标签库 |
标签库的URI |
前缀 |
Core |
http://java.sun.com/jsp/jstl/core |
c |
I18N |
http://java.sun.com/jsp/jstl/fmt |
fmt |
SQL |
http://java.sun.com/jsp/jstl/sql |
sql |
XML |
http://java.sun.com/jsp/jstl/xml |
x |
Functions |
http://java.sun.com/jsp/jstl/functions |
fn |
JSTL下载与导入
从Apache的网站下载JSTL的JAR包。进入 “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”网址下载 JSTL的安装包,并解压
使用jsp的taglib指令导入核心标签库
JSTL核心库的常用标签
1)<c:if test=””>标签
其中test是返回boolean的条件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!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> <body> <%--test中只能写表达式 结合EL表达式使用 --%> <c:if test="${1==1 }"> xxxxxx </c:if> <c:if test="${1!=1 }"> yyyyy </c:if> <c:forEach items="${List }" var="user"> ${user.name } ${user.pwd } </c:forEach> </body> </html>
2)<c:forEach>标签
使用方式有两种组合形式:
1)遍历List<String>的值
2)遍历List<User>的值
3)遍历Map<String,String>的值
4)遍历Map<String,User>的值
5)遍历Map<User,Map<String,User>>的值
entry.key-----User
entry.value------List<String,User>
<%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="com.oracle.demo01.User"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!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> <body> <% //List<String> List<String> l1 = new ArrayList<String>(); l1.add("zhangsan"); l1.add("李四"); request.setAttribute("l1", l1); //List<User> List<User> l2 = new ArrayList<User>(); User u1 = new User(); u1.setId(1); u1.setName("zhang"); u1.setPwd("123"); l2.add(u1); User u2 = new User(); u2.setId(2); u2.setName("lisd"); u2.setPwd("123"); l2.add(u2); session.setAttribute("l2", l2); //Map<String,String> Map<String, String> m1 = new HashMap<String, String>(); m1.put("1", "chengyaojin"); m1.put("2", "houyi"); m1.put("3", "diaochan"); m1.put("4", "yase"); session.setAttribute("m1", m1); //Map<String,User> Map<String, User> m2 = new HashMap<String, User>(); User u3 = new User(); u3.setId(1); u3.setName("ahe"); u3.setPwd("123"); m2.put("1", u3); User u4 = new User(); u4.setId(2); u4.setName("dd"); u4.setPwd("123"); m2.put("2", u4); session.setAttribute("m2", m2); %> <%--遍历List<String>类型 --%> <c:forEach items="${l1 }" var="str"> ${str }<br> </c:forEach> <hr> <%--遍历List<User>类型 --%> <c:forEach items="${l2 }" var="user"> ${user.id }:${user.name }:${user.pwd }<br> </c:forEach> <hr> <%--遍历Map<String,String>类型 --%> <c:forEach items="${m1 }" var="entry"> ${entry.key }:${entry.value }<br> </c:forEach> <hr> <%--遍历Map<String,User>类型 --%> <c:forEach items="${m2 }" var="entry"> ${entry.key }:${entry.value.id }:${entry.value.name }:${entry.value.pwd }<br> </c:forEach> </body> </html>
JavaEE的开发模式
model1模式:
技术组成:jsp+javaBean
model1的弊端:随着业务复杂性 导致jsp页面比较混乱
model2模式
技术组成:jsp+servlet+javaBean
model2的优点:开发中 使用各个技术擅长的方面
servlet:擅长处理java业务代码
jsp:擅长页面的实现
JavaEE的三层架构
服务器开发时 分为三层
web层:与客户端交互
service层:复杂业务处理
dao层:与数据库进行交互
开发实践时 三层架构通过包结构体现
MVC:---- web开发的设计模式
M:Model---模型 javaBean:封装数据
V:View-----视图 jsp:单纯进行页面的显示
C:Controller----控制器 Servelt:获取数据--对数据进行封装--传递数据-- 指派显示的jsp页面
JavaEE三层架构+MVC
web层:收集页面数据,封装数据,传递数据,指定响应jsp页面
service层:逻辑业务代码的编写
dao层:数据库的访问代码的编写
以上是关于JavaWeb学习之动态页面技术(JSP/EL/JSTL)的主要内容,如果未能解决你的问题,请参考以下文章