重温JSP的来龙去脉
来源:互联网 发布:java语言的执行模式 编辑:程序博客网 时间:2024/06/07 17:32
一.jsp的简介
jsp(java server pages)java服务器端的页面,sun公司用于开发动态网站的技术
servlet,jsp就是servlet,最终会在访问jsp页面的时候编译成servlet,放到tomcat的..\work\Catalina\localhost目录里面.jsp的组成: html+java代码+jsp自身的一些东西
- 在jsp里面嵌入java代码有三种方式
第一种方式 <%! %> 定义成员变量
第二种方式 <%= %> 输出语句
第三种方式 <% %> 嵌入java代码
二、jsp的注释
- jsp的组成: html+java代码+jsp自身的一些东西
第一,html的注释
<!-- -->
第二,java注释. 有三种:单行 ,多行 ,文档注释第三,jsp自身的注释 <%-- jsp自身的注释 --%>
- 注释的使用范围
(1)在jsp的源代码阶段,三种注释都存在
(2)在jsp编译成servlet之后,存在html的注释和java的注释
(3)通过浏览器访问jsp之后,在浏览器显示的内容里面只存在html的注释
三、 jsp的指令
- 写法: <%@ 指令的名称 属性=”属性值” %>
jsp里面有三个指令(page,include,taglib)
第一个 page指令
(1)设置页面的一些内容
(2)写法 <%@ page 属性=”属性值”%>
(3)属性1). language:jsp支持的语言类型,目前java
2). extends:jsp最终会编译成servlet,编译成的类继承的类(一般不需要修改,直接使用默认)3).session:是否可以在jsp里面直接使用session对象,true或者false,默认的值是true
4).import:
导入包 ,列如<%@ page import=”java.util.List,java.util.ArrayList”%>
5).buffer:缓冲区的大小
6).autoFlush:超出缓冲区是否会正常输出
7).errorPage:当执行jsp时候,出现异常,通过这个属性可以设置跳转的页面
8).isErrorPage:在错误页面中是否显示错误信息,值是true和false,当值设置成true之后,在生成serlvet里面,创建exception对象,显示错误信息。默认值是false
9).contentType:设置浏览器编码
10).pageEncoding:jsp编译成servlet采用的编码方式
11).isELIgnored:jsp里面是否忽略el表达式,默认是不忽略(可以使用el表达式)。如果把这个属性的值设置成true之后,把el表达式当做普通的文本内容输出第二个 include指令(静态包含)
(1)使用jsp包含其他的jsp页面,跟Android中的include属性相似
(2)写法 <%@ include file=”要包含的页面”%>
(3)注意事项
*注意一:在被包含的页面里面,直接写内容就可以了
* 注意二:在被包含的路径后面不能加参数
* 注意三:file属性的值不能为一变量
(4)使用include指令包含 多个jsp文件,最终会被编译成一个servlet(相当于代码复制 ,..\work\Catalina\localhost目录)第三个 taglib指令
(1)和jstl标签库一起使用,替代jsp页面中 <% %>
(2)写法 <%@ taglib uri=”jstl标签库的路径” prefix=”标签库的别名”%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
四、jsp的内置对象(*)
(1)什么是内置对象:在jsp中生成好的一些现有的对象,直接拿来使用
(2)jsp里面有九个内置对象
1) 、 request : 是servlet里面的HttpServletRequest,代表请求,得到表单提交的数据,是域对象
2)、response:是servlet里面的HttpServletResponse,代表响应,向页面输出内容
3)、session:是servlet里面HttpSession,是域对象
4)、config :是servlet里面的ServletConfig,获取初始化的参数,获取servlet名称
5)、application:是servlet里面的ServletContext,获取全局初始化参数,域对象,获取web项目中的文件
6)、exception:当在页面中使用page指令里面的属性 isErrorPage=”true”,生成异常对象,通过这个对象里面 getMessage()得到异常信息
7)、page:当前对象
8)、out:输出对象
** 通过out输出和使用response.getWriter()使用的是一个对象吗?
不是。out使用的是 JspWriter,response.getWriter()使用PrintWriter
* 在jsp中分别使用out输出和response.getWriter()输出,会产生两个缓冲区,一个是out缓冲区,一个是response缓冲区,使用out输出内容,会把内容放到out缓冲区里面,但是out缓冲区不能直接向页面输出,需要把内容先放到response,通过response进行输出。
9)、pageContext:(*******)
(1)本身也要一个域对象(只有jsp里面有这个对象,servelet中没有对应的)
* 向pageContext域对象里面设置值
<% pageContext.setAttribute("page", "pagevalue"); %>
*从pageContext里面获取值
<%=pageContext.getAttribute("page") %>
*使用el表达式获取域对象里面的值
${page }
(2)向其他的域对象里面设置值 application、session、request、pageContext * 方法:setAttribute(java.lang.String name, java.lang.Object value, int scope) 有三个参数:第一参数是名称,第二个参数是值 第三个参数是域的范围(使用pageContext里面的常量表示) * 创建jsp,分别向四个域对象设置值(3)从其他的域对象里面获取值 * 方法 getAttribute(java.lang.String name, int scope) 有两个参数:第一参数是名称,第二个参数域的范围(使用pageContext里面的常量表示) * 重要的方法 findAttribute(java.lang.String name) ** **如果多个域对象的名称是相同的,使用这个方法得到是域范围小的里面的值**(4)通过这个pageContext对象获取其他的八个内置对象
<% //得到request对象 pageContext.getRequest(); //得到response对象 pageContext.getResponse(); //得到session对象 pageContext.getSession(); ...... %>
*四个域对象作用范围application: 范围是整个web项目session:范围是一次会话request:范围一次请求pageContext:范围当前页面
五、jsp的动作标签
5.1 有六个动作标签(1)<jsp:forward>:实现转发的操作 * <jsp:forward page="/jsp/hello.jsp"></jsp:forward>(2)<jsp:include>:页面包含(动态包含) * <jsp:include page="hello.jsp"></jsp:include> * 多个的jsp会编译成几个servlet? 多个jsp会编译成多个servlet(3)<jsp:param>:传递参数,用在包含路径的标签里面5.2 另外三个动作标签(操作javabean的标签)(1)<jsp:useBean> (2)<jsp:setProperty>(3)<jsp:getProperty>
<!--设置要封装的javabean --> <jsp:useBean id="user" class="com.jrt.test.bean.User"></jsp:useBean> <!--数据封装 name="user"表示当前对象--> <jsp:setProperty property="name" name="user"/> <jsp:setProperty property="age" name="user"/> <!--获取数据 自动输出到页面--> <jsp:getProperty property="name" name="user"/> <jsp:getProperty property="age" name="user"/>
还有一种封装javabean的方式(BeanUtils 要导入依赖jar包)
//创建javabean对象 User user = new User(); //进行数据的封装 try { BeanUtils.populate(user, request.getParameterMap()); } catch (Exception e) { e.printStackTrace(); }
六、el表达式
6.1 作用:获取域对象里面的值6.2 使用el表达式获取域对象里面的值(1)写法: ${名称}(2)创建jsp页面,在页面中分别向四个域对象设置值,使用el表达式获取值 <!-- 分别向四个域对象里面设置值 --> <% application.setAttribute("app", "appvalue"); session.setAttribute("app", "sessionvalue"); request.setAttribute("app", "requestvalue"); pageContext.setAttribute("app", "pagevalue"); %> <!-- 使用el表达式获取域对象里面的值 --> <!-- 得到applicat里面的值 --> ${applicationScope.app } <br/> <!-- 得到session里面的值 --> ${sessionScope.app } <br/> <!-- 得到request里面的值 --> ${requestScope.app } <br/> <!-- 得到pageContext值 --> ${pageScope.app } (3)*如果多个域对象名称是相同的,如果使用 ${名称}得到域范围小的里面的值 (4)分别使用传统方式和el表达式获取域对象里面的值,如果属性名称不存在的情况下,输出的默认值如下: *使用传统方式(getAttribute)得到null *使用el表达式得到空字符串 <%=request.getAttribute("xxx") %> <!--输出 null --> <hr/> ${xxx } <!--输出 空字符串 -->
6.3 向域对象里面放数组,集合(list和map)、对象,使用el表达式获取值
(1)向域对象里面放数组
<!-- 向域对象里面放数组,使用el表达式获取域对象里面数组的值 --> <% //创建数组 String[] arr = {"lucy","jack","mary"}; //把数组放到域对象里面 request request.setAttribute("arr100", arr); %> <!-- el获取域对象里面数组的值 --> ${arr100[2] }
* 通过下标得到域对象数组的值,数组的下标从0开始的,如果写的下标超出了数组的访问,得到空字符串(2)向域对象里面放list集合
<% //创建list集合 List<String> list = new ArrayList<String>(); list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); //把list集合放到域对象里面 request.setAttribute("list", list); %> <!-- el获取域对象里面list集合的值 --> ${list[2] }
(3)向域对象里面放map集合 * 根据map的key得到value
<!-- 向域对象里面放map集合,使用el表达式获取域对象里面map集合的值 --> <% //创建map集合 Map<String,String> map = new HashMap<String,String>(); map.put("aaa", "AAA"); map.put("bbb", "BBB"); map.put("ccc", "CCC"); //把map集合放到request域对象里面 request.setAttribute("map", map); %> <!-- 使用el表达式获取域对象里面map集合的值 --> ${map.aaa }
(4)向域对象里面放对象
<!-- 向域对象放javabean对象,使用el表达式获取域对象里面对象的属性的值 --> <% //创建user对象 User user = new User(); user.setUsername("女神"); user.setAge(18); user.setAddr("火星"); //把user对象放到域对象里面 request.setAttribute("user", user); %> <!-- 使用el表达式获取域对象里面对象的属性的值 --> ${user.username } ${user.age } ${user.addr }
七、Jstl标签库
7、jstl (JavaServerPages Standard Tag Library)jsp的标准标签库7.1 和jsp里面taglib指令一起使用,替代页面中的<% %> * <%@ taglib uri="jstl标签库的路径" prefix="标签库别名"%>7.2 jstl里面的标签 if标签, choose标签,forEach标签7.3 如果想要使用jstl标签,首先导入jar包
jstl常用标签的使用
1、c:if标签
<!--条件判断 --> <!--条件判断 --> <c:set var="a" value="5"></c:set><!--定义变量 --> <c:if test="${a!=5 }"><!--判断条件 --> a=${a}<!--输出结果 --> </c:if>
2、c:choose标签
<!--switch判断 --> <c:set var="a" value="5"></c:set> <c:choose><!--switch --> <c:when test="a==4"><!--case --> a=4 </c:when> <c:when test="a==5"> a=5 </c:when> <c:otherwise><!--default --> a=5 </c:otherwise> </c:choose>
3、c:forEach标签
- 遍历域对象中数组的值
- 遍历域对象中list集合的值
- 遍历域对象中set集合的值
- 遍历域对象中map集合的值
- 遍历域对象中多个对象的值
<!--遍历数组 --> <%String[] arr={"zhangsan","lisi","wangwu"}; request.setAttribute("arr",arr); %> <!--for(String s:arr){} --> <c:forEach var="a" items="${arr}"> ${a} </c:forEach> <hr/> <!--遍历list集合 --> <% List<String> list=new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); request.setAttribute("list", list); %> <c:forEach var="item" items="${list}" > ${item } </c:forEach> <hr/> <!--遍历set --> <% Set<String> set=new HashSet<String>(); set.add("1"); set.add("2"); set.add("3"); request.setAttribute("set", set); %> <c:forEach var="item" items="${set}" > ${item } </c:forEach> <hr/> <!--遍历map --> <% Map<String,String> map=new HashMap<String,String>(); map.put("key1","Value1"); map.put("key2","Value2"); map.put("key3","Value3"); request.setAttribute("map", map); %> <!--var="entrySet" 相当于java中map.entrySet() --> <c:forEach var="entrySet" items="${map}"> ${entrySet.key} ${entrySet.value}<br/> </c:forEach> <hr/> <!--遍历域对象中多个对象的值 --> <% User user1=new User(); user1.setName("小马哥"); user1.setAge(43); User user2=new User(); user2.setName("东哥"); user2.setAge(41); List<User> users=new ArrayList<User>(); users.add(user1); users.add(user2); request.setAttribute("users", users); %> <c:forEach var="user" items="${users}"> ${user.name} ${user.age}<br/> </c:forEach>
- 重温JSP的来龙去脉
- 重温JSP之一
- 重温sevlet jsp
- 伊朗核问题的来龙去脉
- MFC程序的来龙去脉
- MFC程序的来龙去脉
- MFC程序的来龙去脉
- MFC程序的来龙去脉
- 对话框的来龙去脉
- OpenGL的来龙去脉
- dll调用的来龙去脉
- DoDataExchange 的来龙去脉
- Base64编码的来龙去脉
- ItemsControl 的来龙去脉
- Linux日志的来龙去脉
- IVTC/Deinterlace的来龙去脉
- MFC程序的来龙去脉
- 程序的来龙去脉
- 学做Ubuntu内核 *.deb包
- 语义识别(一):隐性马尔可夫模型
- FTPrep, 98 Validate Binary Search Tree
- javaWeb-servlet的执行流程详解
- SSH工程整理
- 重温JSP的来龙去脉
- SVM -支持向量机原理与实践之实践篇
- bzoj 2306: [Ctsc2011]幸福路径
- 【Android】Error[*,*]Could not find method android() for arguments [……]
- bitset用法小结
- opencv-python(4):用滑动条作调色板
- MD5
- 决Maven项目相互依赖/循环依赖/双向依赖的问题
- 方差与偏差