JAVA EE-JSP
来源:互联网 发布:淘宝店铺自定义装修 编辑:程序博客网 时间:2024/05/29 19:13
JAVA EE-JSP
当一个人在深思的时候,他并不是在闲着。有看得见的劳动,也有看不见的劳动。 —— 雨果
什么是JSP?
java server page 运行在服务器端的页面. ==> 本质就是servlet.运行流程: jsp =(第一次访问时)=> .java ==> .class ==> 运行JSP中的脚本: <% java内容 %> 该脚本包裹的代码会出现在 service方法中 <%=表达式 %> 该脚本用于输出内容.out.print();方法包裹输出内容. <%! 内容 %>(了解): 该脚本包裹的内容会出现在类定义中.
关于EL表达式
代替 脚本 => 输出脚本 <%= %> 格式: ${表达式} EL表达式可以在4个域中取数据 => 4个内置对象 applicationScope/requestScope/sessionScope/pageScope 从指定域取值: ${requestScope.name}<br> ${applicationScope.name}<br> 不指定域取值: ${name}<br> => 从小域到大域中查找.显示最先找到的.
JSP的翻译过程
JSP的脚本元素
JSP的页面注释
- JSP注释:<%– … –%>,转化阶段消失,只能被开发人员看到
- JAVA注释://、//、/*/,编译阶段消失
- HTML注释:, 不会消失,在页面中也能看到
JSP的指令元素
- 功能
- 用于指示JSP执行某些步骤
- 用于指示JSP表现特定行为
- 语法格式
<%@ directive [ attribute =“value” ] * %> 分类
- page指令标记
- include指令标记
- taglib指令标记
page属性包含在
“<%@ page ”和“%>”
之间。- 这些属性可以单独使用,也可以几个或多个同时使用
- page指令用来定义JSP文件的全局属性
- 在JSP页面中,只有import可以出现多次,其它属性都只能出现一次
page 指令 include指令 taglib 指令 功能: page : 描述页面的一些属性. include: 静态包含指令 taglib : 导入标签指令page : <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> page指令用于指定页面一些基本属性. language="java" 页面中使用的语言为java. *import="java.util.*" 就是导包. 是所有属性中唯一一个可以在页面中出现多次的属性. *pageEncoding="UTF-8" 页面保存到硬盘编码. *contentType="text/html; charset=UTF-8" 发送给浏览器的编码 . 以上两个码表最好一致. 但是一般设置一个属性即可.另外一个属性自动设置. autoFlush="true" 如果缓冲区装满是否自动刷新到浏览器. 如果装满并没有选择自动刷新,那么会抛出异常. buffer="8kb" 决定jsp输出缓冲区大小为8kb errorPage="" 配置当前页面的错误页面 isErrorPage="false" 指定当前页面是否是一个错误页面 开发中,我们可以使用如下配置统一配置错误页面 比上面的方式要省事: <error-page> <error-code>500</error-code> <location>/page/B.jsp</location> </error-page> extends="" 决定当前jsp的父类是谁.父类必须是servlet的子类. info="" getServletInfo 刚方法的返回值. isELIgnored="false" 决定当前页面能否使用 EL表达式. 默认值就是支持el. session="true" 当前jsp页面是否可以直接使用session对象.默认值就是true.
JSP中的静态包含
- include指令的语法格式如下
<%@ include file=“filename” %>
- include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
- 静态包含的含义
- file不能为一变量
<% String url="index.html" ; %>
<%@ include file = "<%= url %>" %>
- 不可以在file 所指定的文件后接任何参数
<%@ include file = "jw.jsp?nm=browser" %>
比如
包含的是目标文件的源码;包含过来,一起翻译
main.jsp<% String s = “abc”;%><%include file=“part.jsp” %>part.jsp<%=s %> 没有定义变量s尽管part.jsp本身会有错误但是运行main.jsp就可以正确引入part.jsp
JSP的内置对象
指的在jsp中不加以声明就可以直接使用的9个对象.
原理: 因为我们的代码是写在jsp对应java的service方法中的.所以在service方法中声明的变量,我们可以直接使用.
JSP中内置对象的类型
- request HttpServletRequest
- response HttpServletResponse
- session HttpSession
- application ServletContext
- config ServletConfig
- page this (HttpServlet)
- pageContext PageContext
- exception Throwable (所有异常父类)
- out JspWriter
public void _jspService(HttpServletRequest 1>request, HttpServletResponse 2>response) throws java.io.IOException, ServletException { PageContext 3>pageContext = null; HttpSession 4>session = null; Throwable 5>exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request); if (exception != null) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } ServletContext 6>application = null; ServletConfig 7>config = null; JspWriter 8>out = null; Object 9>page = this;
JSP中的四种数据范围
- page Page_Scope 页面的不同部分间共享数据
- request
- session
- application
- setAttribute getAttribute
- removeAttribute
关于pageContext对象
- pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性
- 它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问
*本身是一个域对象. 在pageContext对象上有一个map. 这个Map就是Page域. 操作: 4个操作. 范围: 就只在当前页面中有用. 作用: 在jsp中应避免在页面上书写任何java代码. //pageContext.setAttribute(name, value); // pageContext.getAttribute(name); //pageContext.removeAttribute(name); //pageContext.getAttributeNamesInScope(scope); *pageContext对象还可以操作其他3个域 目的就是为了方便. pageContext.setAttribute("name", "applicationTom",PageContext.APPLICATION_SCOPE ); pageContext.setAttribute("name", "sessionTom",PageContext.SESSION_SCOPE ); pageContext.setAttribute("name", "requestTom",PageContext.REQUEST_SCOPE ); //pageContext.getAttribute(name, scope); //pageContext.removeAttribute(name, scope); //pageContext.getAttributeNamesInScope(scope); //pageContext.findAttribute("name") 会从所有域中查找键. 从小到大 *持有其他8个内置对象的引用.根据这个对象可以获得其他8个内置对象 pageContext.getRequest(); pageContext.getResponse(); pageContext.getSession(); pageContext.getServletContext(); pageContext.getException(); pageContext.getServletConfig(); pageContext.getOut(); pageContext.getPage();
out对象
- 向客户端输出数据
- 管理服务器输出缓冲区
- 内部使用PrintWriter对象来输出文本级数据
- 通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb
out 对象是jsp当中的输出对象. 代码: out.print("a"); response.getWriter().print("b"); out.print("c"); response.getWriter().print("d"); 输出: bd ac 原理: 在输出到浏览器时,会先把两个流合并,再输出. 合并时response的字符流在前. JSPWriter在后. 所以不管代码书写顺序如何.最终 response流的内容总会在JSPwriter流的内容之前 结论: 在jsp中输出使用out(JSPWriter)输出,不要使用response.getWriter输出.
JSP标签
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
语法
<jsp:include page={"relativeURL" | "<%= expression %>"} /><jsp:include page={"relativeURL" | "<%= expression %>"} > <jsp:param name="PN" value="{PV | <%= expression %>}" /> *</jsp:include>
- JSP的常用动作标签
<jsp:useBean> 使用一个ID和一个给定作用范围和同一ID的JavaBean相关联<jsp:setProperty> 设置JavaBean的属性值<jsp:getProperty> 取得JavaBean的属性值<jsp:include> 请求时文件包含<jsp:forward> 接受用户输入并将请求分派给另一页面<jsp:param>
forward标签详解
</head> <body> <%-- JSP动作标签 分担jsp页面的java代码 --%> <jsp:forward page="/index.jsp"></jsp:forward> <%-- //下面的代码相当于上面的标签 request.getRequestDispatcher("/index.jsp").forward(request, response); --%> </body></html>
include标签详解
<body> <%-- JSP动作标签 分担jsp页面的java代码 --%> <jsp:include page="/index.jsp"></jsp:include> <%-- // jsp 动态包含 request.getRequestDispatcher("/index.jsp").include(request, response); --%> </body>
<jsp:include>
与include指令的比较
<jsp:include>
标签是动态引入,<jsp:include>
标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。- 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
- 不管是
<jsp:include>
标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
JavaBean
- 功能: 将表单参数封装到User对象
//参数1: 填写User对象
//参数2: 填写需要封装到User对象的参数Map
BeanUtils.populate(u,request.getParameterMap());
注意: 表单的参数的键必须与Bean中属性名称对应
// BeanUtils 可以自动帮你转换8个基本数据类型. 如果遇到自定义类型需要转换.我们要自己写一个转换器并注册
1.自定义转换器 public class MyDateConverter implements Converter { //参数2 : 待转换的类型传递进来. => 2012-12-12 // 转换好之后,使用返回值返回 => Date对象 //参数1: 告诉你要转换成什么类型的 public Object convert(Class arg0, Object arg1) { //创建格式化器 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //使用格式化器将参数格式化成日期类型 try { Date date = format.parse(arg1.toString()); //没出异常.就返回日期对象. return date; } catch (ParseException e) { e.printStackTrace(); //出现异常返回null return null; } } } 2. 转换器注册 //注册我们自定义的转换器 //参数1 自定的转换器 //参数2 注册转换的类型 ConvertUtils.register(new MyDateConverter(), Date.class);完成如上两步即可.
首先创建一个学生类
//javaBean//1.要求为属性提供get/set方法任意之一//2.需要有空参构造//3.实现串行化接口(可选)public class User { private String name; private String password; private int age; private Date hiredate; public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [name=" + name + ", password=" + password + ", age=" + age + ", hiredate=" + hiredate + "]"; }}
一个小Demo
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建User对象 User u = new User(); // 将表单参数封装到User对象 //参数1: 填写User对象 //参数2: 填写需要封装到User对象的参数Map try { //如果我们需要BeanUtils支持非8大基本数据类型.我们只要给BeanUtils添加类型转换器即可 //注意:注册类型转换器,必须写在populate方法之前. ConvertUtils.register(new MyDateConverter(), Date.class); //BeanUtils在封装时可以完成类型转换. 自动转换的范围 只限于 8个基本数据类型 BeanUtils.populate(u,request.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(u); /* //1 获得参数 String name = request.getParameter("name"); String password = request.getParameter("password"); //2 封装参数 User User u = new User(); u.setName(name); u.setPassword(password);*/ //------------------------------------------------------- //3 将User对象交给业务类处理 //4 根据处理结果 //成功=>在session加入成功标识,并重定向到成功页面 //失败=>回到登录页面.提示错误信息 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
JSTL标签
用于代替,简化页面中的java代码. Java standard Tag Library => java标准标签库 apache组织提供一套已经开发好的标签库. 这套标签库在javaee 5.0版本后已经纳入标准.(使用不需要导包) 该套标签库一共分为4个库: core:核心库(用的最多的)**** fmt:格式化库(2个) xml:xml的操作相关(废弃) sql: 与数据库操作相关(废弃)
- core库(重点:if choose foreach url):
- 在页面引入标签库
- 2.使用.
if标签
<%-- <c:if>(常用) 判断 test="${num1 > num2 }" 填写返回值为boolean的表达式 var="if" 键 scope="page" 域 将判断结果以var属性值为键放入该属性指定的域中. --%> <% request.setAttribute("num1", 1000); request.setAttribute("num2", 10000); %> <c:if test="${num1 > num2 }" var="if" scope="page" > num1 厉害! </c:if> ${pageScope.if} <hr>
if else
<%-- 判断标签.支持if else形式 <c:choose> <c:when> test: 填写返回值为boolean的表达式 <c:otherwise> --%> <c:choose> <c:when test="${num1 > num2 }"> num1 厉害! </c:when> <c:otherwise> num2 厉害! </c:otherwise> </c:choose> <hr>
遍历标签
<%-- <c:forEach>(常用) 遍历标签 items="${requestScope.list}" 要便利的集合设置给该属性 var="abc" 每次遍历集合中元素 该属性值作为键放入page域 varStatus="st" 每次遍历的状态,会封装成一个对象 以该属性值为键 放入page域 数数的功能 begin="1" 从几开始数 end="100" 数到几 step="1" 每次数几个数 var="num" 将当前数的数以该属性值作为键放入page域 --%> <% List list = new ArrayList(); list.add("tom"); list.add("jerry"); list.add("jack"); list.add("rose"); request.setAttribute("list", list); %> <table border="1"> <tr> <th>名称</th> <th>是否是集合中第一个元素</th> <th>是否是集合中最后一个元素</th> <th>显示当前遍历的索引</th> <th>显示当前遍历的计数</th> </tr> <c:forEach items="${requestScope.list}" var="abc" varStatus="st" > <tr id="${st.index%2==0?"even":"odd"}" > <td>${pageScope.abc}</td> <td>${pageScope.st.first}</td> <td>${pageScope.st.last}</td> <td>${pageScope.st.index}</td> <td>${pageScope.st.count}</td> </tr> </c:forEach> </table> <hr> <!-- ----------------------------------------------------------------------- --> <c:forEach begin="1" end="100" step="1" var="num" > ${num} </c:forEach>
fmt库 格式化库 格式化日期
<!-- 格式化日期 fmt:formatDate --> <fmt:formatDate value="<%=new Date() %>" pattern="yyyy/MM/dd hh:mm:ss" var="date" scope="request" /> ${requestScope.date} 格式化数字 <!-- 格式化数字 fmt:formatNumber --> <fmt:formatNumber value="3.1415926" pattern="0000.00000000000" var="num1" scope="request" ></fmt:formatNumber> <fmt:formatNumber value="3.1415926" pattern="####.###########" var="num2" scope="request" ></fmt:formatNumber> ${requestScope.num1}<br> ${requestScope.num2}<br>
JSP中的路径总结问题
路径总结
前提: 所有路径都应以”/”开头.
项目名:day10-jsp资源名:AServlet客户端路径 => 给浏览器用的路径 => 填写项目名称 <form action="/day10-jsp/AServlet" > <img src="/day10-jsp/AServlet" > <a href="/day10-jsp/AServlet" > response.sendRedirect("/day10-jsp/AServlet")服务器端路径 => 给服务器端使用的路径 => 填写项目下的路径 request.getRequestDispatcher("/AServlet") errorPage="/AServlet" <location>/AServlet</location>
0 0
- JAVA EE-JSP
- Java EE.JSP.概述
- Java EE.JSP.动作组件
- Java EE基础之JSP
- Java EE JSP编程基础
- 学习笔记-轻量级Java EE:JSP基本知识
- java EE JSP运行出现错误
- java EE复习之jsp的原理
- Java EE中jsp中文乱码问题
- JAVA EE---JSP 学习第一天
- 3 java ee(3)----JSP和servlet
- Java EE基础之JSP(二)
- Java EE之Servlet、JSP学习
- 解决JAVA EE项目中JSP无法显示绝对路径图片
- Eclipse Java EE IDE中jsp页面编码修改
- 轻量级Java EE 企业应用实战-JSP笔记(三)-servlet
- Java EE基础学习总结(一、JSP基础语法)
- java EE之jsp的7个动作指令 复习
- android webview字体大小的设置
- C++中delete和delete[]的区别说明
- [RK3288][Android6.0] Display驱动初始化流程小结
- 九九乘法表
- devAid-Theme
- JAVA EE-JSP
- UGUI内核大探究(十七)拾遗补缺
- java中的事件监听机制
- mysql windows zip安装
- 知识积累3:什么是反向代理,如何区别反向与正向代理
- 【线段树】[CodeForces - 717F]Heroes of Making Magic III
- DP题目 创意吃鱼法
- codeforces #720 720A 720B
- 如何录屏制作gif图片