前面简单说了一个《JSP页面实际上就是Servlet》,接下来说脚本元素
JSP脚本元素
脚本元素<%%>由JSP引擎处理,所有其它文本、脚本外的元素均为响应的一部分
JSP脚本元素的分类
五类:
注释:<%-- 注释内容 --%>
指令标签:<%@ 指令%> 会影响JSP的翻译阶段
页面访问这个jsp
发现这个页面不能够被编译
我们加上包
页面返回成功
大家可以考虑去查看jsp转换的servlet,看看有什么不同。
声明标签:运行JSP开发人员包含类级声明
<%! 声明 %>
我们在JSP写一个变量
找到我们翻译后的Servlet,打开它
可以看到我们声明的一个变量,同时这个变量是在一个方法体中,换句话说就是这个变量是一个局部变量
我们用声明标签标注
在看我的Servlet中
找不到了?我们往上翻
这是在类体中,换句话说,这个变量变成了属性
除了属性我们也可以是方法,因为是"类级"的
然后我们访问页面,可以看服务器
Servlet中也有这个方法
脚本标签:运行JSP开发人员在_jspService中包含任意的java代码
<% javaCode %>
JSP翻译的Servlet中
这个是我们最多的,后面会非常多,就是我们方法体中最常见的代码,类似这样
这个就不多举例子了,后面会很多
表达式标签:将Java运行时的表达式的值送至HTTP响应流中
<%= 表达式 %>
这个我们之前用过的
响应流的意思看这里
OK,这就是五个脚本元素
首先创建名称为Person的类,将其放置在com.chesg.bean包中,实现对用户信息的封装,下图是eclipse编辑器文件结构图
关键代码如下,Person.java文件
package com.chesg.bean;public class Person {private String name; private int age; private String sex; private String add; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAdd() { return add; } public void setAdd(String add) { this.add = add; }}
创建程序的主页面index.jsp,在该页面中放置录入所需要的表单,源码如下index.jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>第一个Java Web应用</title></head><body ><form action="reg.jsp" method="post"> <table align="center" width="400" border="1" height="200"> <tr> <td colspan="2" align="center" height="40"> <b>添加用户信息</b> </td> </tr> <tr> <td align="right">姓名:</td> <td ><input type="text" name="name"/></td> </tr> <tr> <td align="right">年龄:</td> <td> <input type="text" name="age"> </td> </tr> <tr> <td align="right">性别:</td> <td> <input type="text" name="sex"> </td> </tr> <tr> <td align="right">住址:</td> <td> <input type="text" name="add"> </td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="添 加"> </td> </tr> </table></form></body></html>
创建名称为reg.jsp的JSP页面,用于对index.jsp页面中表单的提交请求进行处理。该页面将获取表单提交的所有信息,然后将所得的用户信息输出到页面中,源码如下reg.jsp文件
<%@ 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><%request.setCharacterEncoding("UTF-8"); %><jsp:useBean id="person" class="com.chesg.bean.Person" scope="page"> <jsp:setProperty name="person" property="*"/></jsp:useBean><table align="center" width="400" > <tr> <td align="right">姓名:</td> <td > <jsp:getProperty property="name" name="person"/> </td> </tr> <tr> <td align="right">年龄:</td> <td> <jsp:getProperty property="age" name="person"/> </td> </tr> <tr> <td align="right">性别:</td> <td> <jsp:getProperty property="sex" name="person"/> </td> </tr> <tr> <td align="right">住址:</td> <td> <jsp:getProperty property="add" name="person"/> </td> </tr> </table></body></html>
reg.jsp页面中的<jsp:userBean>标签实例化了JavaBean,然后通过<jsp:setProperty name="person" property="*"/>对Person类中的所有属性进行了赋值,使用这种方式要求表单中属性名称与JavaBean中的属性名称一致。
在获取了Person的所有属性后,reg.jsp页面通过<jsp:getProperty>标签读取JavaBean对象Person中的属性。实例运行后,将进入到程序的主页面index.jsp页面,最后效果如图所示:
1、《JSP页面实际上就是Servlet》
2、《JSP页面中最常使用的脚本元素》
3、《JSP页面隐藏了哪些对象》
Page指令
我们在说《JSP页面中最常使用的脚本元素》的时候,提到了指令标签
而Page指令,就是一种极其常见的指令
之前使用的例子:
Page指令可以在页面内随便放置,一般是放在页首的位置。
里面有很多使用:
(1)language:
language属性有默认,写成别的编译不了
写法是:<%@ page language="java"%>
(2)extends:
标明JSP编译时需要加入的Class的全名,最好不使用它,它会限制JSP的编译能力.
写法是: <%@ page extends="package.class"%>
(3)import:
import属性,写了之后会自动添加到servlet的import语句中,但不进行包存在性的检查;
写法:<%@ page import="java.util.*"%>
(4)session:
Session对象是否参与会话,session="false"就没有session对象了
写法:<%@ page session="false"%>
(5)buffer:
buffer属性指定out对象(JspWriter)使用的缓冲区大小,以kb为单位,默认8kb
写法:<%@ page buffer="none"%>
(6)autoFlush:
autoFlush属性控制当缓冲区满了后,是自动清空输出缓冲区(默认true),还是在缓冲区溢出后抛出异常(false)。
写法:<%@ page autoFlush="true"%>
(7)isThreadSafe:
isThreadSafe问你的应用是否是线程安全的,缺省为true,表示应用是线程安全的,可以同时响应多个请求;如果设置为false,那么一次只能处理一个用户请求。
写法:<%@ page isThreadSafe="false"%>
(8)info:
定义一个可以在servlet中通过getServletInfo方法获取的字符串。 jsp容器做的是在servlet中生成getServletInfo方法返回info属性指定的String
写法:<%@ page info="infotext"%>
(9)errorPage:
errorPage="relativeURL" 设置处理异常事件的JSP文件。
isErrorPage="true | false" 设置此页是否为出错页,如果被设置为true,你就能使用exception对象
写法:<%@ page errorPage="error.jsp"%>、、<%@ page isErrorPage="true"%>
(10)isELIgnored:
isELIgnored忽略el表达式
写法:<%@ page isELIgnored="true"%>
(11)contentType:
contentType属性设置发送到客户端文档的响应报头的类型和字符编码。多个使用;号分开。 pageEncodeing属性只用于更改字符编码
写法:<%@ page contentType="text/html; charset=UTF-8"%>
Charset设置的是页面的字符集、pageEncoding定义的输出流的字符集
我们写整理这些,里面的内容会在学习的过程中不断扩展,这次我们就做一个小例子
我们在我们之前的页面写一个明显的错误
然后我们运行服务器
然后访问页面
点击提交
页面就会出现错误
但是这个看的人有点晕。特别是用户他不知道这是什么
我们写一个错误页面
我们写内容
然后在错误页面引入
然后就看到我们写的内容了,这样就不会出现前面用户看不懂的情况,我们可以写我们想写的
这个例子最后一个,也出现了Exception中的隐藏对象,记到笔记了,又遇到一个。
1、《JSP页面中常见的page指令》
2、《JSP页面中最常使用的脚本元素》
我们在说指令标签的时候
说到过一个指令Page指令
大家可以翻阅下之前的内容,这次我们说一个include指令,经常被人们和JSP重用模板连接在一起。
我们使用一个例子来了解include指令:
先创建两个文件:
然后分别编辑两个页面的内容
访问界面
我们可以看到这些是公共部分
这些公共部分,就是我们可以重用的地方
我们把这些内容放到一个公共位置,其它引入进来
我们创建一个common.jsp
把公共内容放进来
我们怎么引入呢?有两种
第一种
第二种
无论哪种,此时修改common.jsp,可以重新访问a.jsp和b.jsp可以看到时一起修改的,是不是类似于java基础中方法的作用。
那这两种引入有什么区别呢?我们还是看jsp翻译成的Servlet
我们先看a.jsp的Servlet
我们再看b.jsp对应的Servlet
是不是不一样,我们通常把a.jsp这种称为静态引入,b.jsp称为动态引入
区别就是静态是已经在翻译的文件Servlet里
动态的是在运行的时候才会生成的内容,运行的时候,可以临时变化的就是动态的。
那么我们总结下:
将一个代码片段在翻译期间,包含在JSP页面的文本中
<%@ include file = frangmentURL%> 静态的
<jsp:include page= frangmentURL />动态的
01
displytag
与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮、完善。
02
cewolf tag
用来在web上显示复杂图形报表的一个jsp tag。
03
Loading Tab
当一个复杂的操作可以加载比较长的时间时,用这个tag。
04
DbForms
DbForms!它是一个基于 Java (Servlet,JSP/Taglib)的快速应用程序开发环境,可以帮助开发人员快速建造基于Web的数据库应用程序。
05
Jakarta Taglibs
Jakarta Taglibs是为JSP定制标签库和相关的项目提供的一个开源仓库,如TagLibraryValidator类,和对页面生成工具的扩展来支持标签库。Jakarta Taglibs 也包括了对JSP Standard Tag Library (JSTL)的参考实现。这个实现基于项目标准。目前,在Jakarta Taglibs中没有其它标签库代表了Java Community Process (JCP) 标准。
06
EasyLDAP
LDAP标签库为JSP程序员和Web页面设计者提供了最容易的方法来执行任意的LDAP操作。
07
WebJMX
WebJMX标签库项目可以控制你的JMX接口。WebJMX这个标签库项目的目的是生成一个JSP标签库,可以让有技巧的JSP开发人员为JMX生成一个可定制的、规范的、基于Web的界面。
08
JSP Tree Tag
JSP Tree Tag是一个显示树形结构jsp标签,它只把需要显示的部分送到客户浏览器。
09
Google Tag Library
该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。
10
TableTag
TableTag是类似于DataGrid的Jsp标签库。通过java.util.List填充数据。
11
uitags
uitags利用这个开源自定义标签可以很容易开发出一个友好的用户界面
12
ValueList
ValueList利用这个标签可以进行数据过滤,排序,分页。而且界面挺漂亮的。
13
JCE taglib
JCE taglib把JCE(Java Cryptographic Extensions)包装成TagLib并且包含了EL函数。使用这个标签能够为jsp应用程序加强安全性。
14
Prize Tags
Prize Tags是一个集许多功能于一身的Jsp标签库。其中最受欢迎的Tree Tag,这个Tag可以为不同节点指定不同的图标,而且可以服务端可以监控客户端节点的展开,关闭,选中与未选中等事件。除了Tree Tag还有日历Tag,Icon Tag,Alternate Tag ,Template Tag 等其它的功能。
15
Struts-Layout
Struts-Layout是一个用在Struts的标签库.这个强大的标签库可以用来显示面板(panels),输入框,表格,treeviews,sortable lists,datagrids,popups,日历等.使用这些标签可以不用写HTML代码,甚至可以不用懂得HTML.这个项目还提供一个Eclipse下的插件Kiwi帮助使用Struts和Struts-Layout来开发Jsp页面.以下是一张例图:
16
JImageTaglib
JImageTaglib是一个用在J2EE Web应用程序的Java标签库.它用来在服务端生成与处理图片然后再反馈到JSP页面.可以过滤(filtering)图片,调整图片文件大小,生成条形码等.
17
uitags
uitags是一个开源的JSP custom-tag库.它让开发友好的用户界面变得简单.
18
AWTaglib
AWTaglib是一个Jsp标签可用于创建网格(grid)控件.它还提供一些额外的功能可以把网格中的数据导出为XLS,PDF和CSV(利用JasperReports来实现)并能与Struts框架相结合.
19
eXtremeTable
eXtremeTable是一个可扩展的用于以表格的形式来显示数据的一组JSP标签库.
20
Ditchnet JSP Tabs Taglib
这是一个可用来开发多页选项板(Tabbed Pane)的简单标签。以下是一个Demo:Foo is cool!
21
jpa-taglib
jpa-taglib为使用Java Persistence API提供一个JSP标签库。这个标签库定义了六个标签涉及一些普通的数据存取任务。
em, 获取一个EntityManager
tx, 事务定界
persist, 通过当前EntityManager来把对象持久化
remove, 从数据存储中移除去对象
find, 通过一个给定的主关键字来查找对象
refresh, 刷新对象的内容
22
UI Widgets Tags
这组JSP标签包含了一些常用的UI构件(wizzard, tree, progressBar, list, comboBox和titled panel)。AJAX技术也被尽可能地运用到其中。
23
FormView
FormView标签能够根据状态(新增,查看,修改,删除操作)和表单的属性(最大长度,是不是Date或是否必填等)来控制Form中的表单到底是要修饰成READ-ONLY或还是READ-WRITE。因此利用FormView我们就可以在同一JSP页面中很简洁得实现CRUD(CREATE,UPDATE,READ,DELETE)操作而无需多个JSP页面或复杂的条件判断。它看起来类似于struts-layout,但是FormView不仅能够控制简单的HTML input而且还能够控制任何能生成HTML input的JSP标签(如struts的html:text标签,也可以是自己开发的标签)。
24
Google:maps JSP Taglibrary
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要java或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。
25
dt-Source
dt-Source这个标签库让Displaytag标签能够在JSP页面中直接调用数据源(Hibernate,JDBC等)中的数据。dt-Source基于Spring框架开发。
26
MicroNova YUZU
MicroNova YUZU开源基于EL的JSP标签库。这是一个增强的JSTL(兼容JSP1.2与JSP 2.0)。
27
JSControlsTags
JSControlsTags这个JSP标签库提供了一些基于Ajax(Prototype.js/aculous.js)技术的Web UI控件(Autocomplete,Slider/AjaxSlider,Treeview,Swap)。JSControlsTags利用JSON来在服务器与客户端之间传递信息。
28
pack:tag
pack:tag是一个用于压缩静态资源的JSP标签库。它能够压缩Java或CSS并缓存到内存或文件中。压缩算法可针对不同资源类型进行扩展。扩展使用策略设计模式实现。利用pack:tag压缩静态资源:能够减少带宽;加速客户端装载时间;混淆内容和资源名称。解决Java文件浏览器缓存问题(将HashCode成新的资源名称)。
29
Jmesa
Jmesa是ExtremeTable项目重新开发一个的Html表格组件,提供过滤、排序、分页、数据导出等功能。Jmesa非常易于使用,可按自己的需求进行扩展。JMesa需要JDK1.5以上的环境。
30
ExtTLD
ExtTLD是一个封装ExtJS框架的JEE标签库。如果你不熟悉java,但只要会使用标签,同样可以使用ExtJS漂亮的UI组件。
前面一直提到了Servlet的内容,也是我们平时理解的后台,这次说一下前台的内容:JSP
JSP定义:允许在标准的HTML页面上包含Java代码的页面
JSP目的:表现和业务逻辑的分离
JSP页面处理过程:
我们做一个例子
新建一个JSP页面
JSP中编写
我们再将hi.html更改
访问地址,点击提交
将我们访问的名字显示出来了
用这个例子我们理解下JSP处理过程
首先我们第一次访问test.jsp
然后进入我们前面说的步骤
翻译完成的Servlet代码在哪里?
找到这个目录
看到我们的项目
这个目录里看到我们的JSP文件
打开后缀为java的文件
里面可以看到这就是将我们的JSP内容翻译成了Servlet
后面就对应编译完的文件
之后就交给Web容器去初始化、实例了,这块不深究了
JSP中的动态INCLUDE与静态INCLUDE的区别
jsp:include 在运行时调用另一个页面变量可以是重复的<% @include file=""%>: 在转译时合在一起 会成为同一个类 变量不可以重复
forward与redirect区别
forward:转发 在下一个页面中,request保留上一个页面中request的所有值。redirect:跳转 不传递request对象
如果实现一个自定义的servlet
extends HttpServlet 并覆盖 dopost或doGet方法 在Web.xml中进行部署
Servlet的生命周期是什么
Init多次执行doGet或doPostdestroy
简单介绍一下Spring bean的生命周期
JSP就是一个Servlet是否正确?
通俗的说jsp是嵌套java代码的html,servlet是嵌套html的java代码两者在实质上是相同的,任何.jsp文件都回被翻译成java代码然后在机器上执行但是由于两者在配置和编写方式上的不同jsp一般被用在view层上,用来显示数据servlet一般做后台的逻辑上的业务处理用
请罗列JSP中的脚本指令及动作
脚本<%%> <%=%> <%!%> <%----%>指令<%@page contentType="text/html;Charset=utf-8" language="Java" import=""%><%@include file=""%><%@taglib url="" prefix="" %>动作<jsp:userBean class="" id="" scope="">在scope中如果没有实例化一个对象如果有直接用以前的<jsp:getProperty name="" property="">想一个bean中设置属性值<jsp:forward>jsp页的转发<jsp:include page="">导入一个jsp页面
jsp的内置对象及方法
Requset 表示httpServletRequest对象取客户端表单域信息 及cookie header和Session response 。response便是HttpServletResponse对象 对客户端的响应 返回文本写cookiesout out向客户端打印html文本pageContext 当前jsp页面的上下文环境 可以得到session request application 等内置对象 在自定义标签中使用的很多application application表示一个javax.servleServletContext 对象,存放容器级的变量config config表示一个javax.servlet Servlet config对象 该对象用于存取servlet实例的初始化参数page page表示从该页面产生的一个servlet实例exception 异常 当iserrorpage=true
request的学习
JSP中的注释方法
<%--注释内容--%> 可以同时注释Java代码和超文本
<%! java代码; %>
带!和; 生成的源码在service()外 是类级别的参数(可以理解为全局变量)
<% Java代码; %>
不带!带; 生成的源码在service()内,是局部变量 每次提交请求修改后的参数会重新赋值为之前的
<%= Java代码 %>
表达式的输出方式 生成的源码在service()内 直接输出 后面没有;
<%@ include file="jsp.jsp" %>
将file设置的外部页面引入到本页面 使之成为一个页面
在file参数的页面里面书写本页面的参数 由于页面中没有参数所以有的编译器会报错 但是实际上并没有错误
<%@ page %>
page指令元素用来设置页面的具体参数 各个参数之间用空格隔开
language:页面脚本类型 书写代码的种类
import:页面导包 多个包用逗号(,)隔开 不推荐使用快捷键
pageEncoding:设置转换编码 如果使用默认的iso-8859-1 则无法保存中文
session:打开页面是否创建session支持session会话跟踪机制 如果为true 则支持
buffer:页面缓存 默认是8kb
info:用来设置页面的签名和书写时间等信息
通过getServletInfo()可以取出
isELIgonred:是否忽略EL表达式 false不忽略
contentType:设置软编码 参数一般是 text/html; charset=utf-8
autoFlush:页面是否支持自动刷新 默认不支持
isThreadSafe:当前线程是否安全 默认是true
true的话是单实例单线程 只能一个用户连接
所以需要设置为false 为 单实例多线程的
isErrorPage:当前页面能否使用exception内置对象 true为可以使用
errorPage:当前页面如果出现异常 自动跳转到哪个页面
-----------------
language="java"
import="java.util.*"
pageEncoding="UTF-8"
session="true"
buffer="8kb"
info="zspmsir"
isELIgnored="false"
contentType="text/html; charset=utf-8"
autoFlush="false"
isThreadSafe="true"
isErrorPage="false"
errorPage="error.jsp"
EL表达式
凡是称之为表达式的都是仅仅可以显示数据 无法进行复杂的业务逻辑
格式: ${要展示的数据} 如果大括号内存在引号 则引号内的数据直接看作是字符串直接输出
算数运算
${"1+2"}=${1+2}
关系运算
${1>2}
逻辑运算
${2>1&&2<12}
三目运算
${2<10?1:0}
范围取值
${pageScope.elena}
格式:${范围.key} 范围有(pageScope,requestScope,sessionScope,applicationScope)
在key值没有冲突的情况下 可以省略范围 直接书写${elena}
如果不指定范围 默认输出范围最小的
接受页面通过?传递过来的值
${param.key} param不能省略
获取配置在web.xml中的全局变量
${initParam.key} 其中的key支持中文
拿取实体类属性值
(类型)session.getAttribute("key").getName()
(类型)是自定义的类 getName()是自定义的方法
${sessionScope.key.name}
注意EL表达式并不一定能显示任意值 必须根据key从范围中拿取
如果无法显示 则不显示任何数据也不显示null
jstl(JSP标准标签库)
<%@ page %> 用来设置全局参数
<%@ include %>用来引入外部文件
<%@ taglib %> 声明使用的标签
JSP第二代标签
赋值
<c:set var="elena" value="elenaPage" scope="page"></c:set>
var:key值 value:value值 scope:范围(page,request,session,application)
取值
<c:out value="要输出的内容"><c:out>
<c:out value="<%=str>"></c:out>
<c:out value="${pageScope.elena}"></c:out>
<c:out value="${requestScope.elena}" default="查无此人"></c:out>
value:要输出的值 可以使用Java代码 可以书写字符串 可以使用El表达式
default:无法取值 默认输出的内容
删除值
<c:remove var="key" scope="session" />
var:要删除的key scope:要删除的范围
如果不指定范围 默认删除所有匹配key的值
流程控制
<c:if test="${3>2}">
<c:out value="条件满足"></c:out>
</c:if>
test:返回true的话 则执行里面的内容
空验证
<c:if test="${empty key}">
<c:out value="满足条件"></c:out>
</c:if>
${empty key}:空验证 判断是否为空
无法取值 返回true
可以取值 返回false
类似if else
<c:choose>
<c:when test="${3>2}">
<c:out value="条件满足"></c:out>
</c:when>
<c:otherwise>
<c:out value="条件不满足"></c:out>
</c:otherwise>
</c:choose>
注意 c:choose必须和c:when在一起使用
內建动作
<jsp:useBean id="key" class="com.zspmsir.po.User" scope="request"></jsp:useBean>
先根据ID提供的key值和scope提供的范围从内存中拿取 如果可以拿取就使用拿取的
如果拿取不到就创建新的对象 并赋值范围
id:对象的key值 这个key值与对象名是重复的 知道key值就知道对象名
class:新建对象的类(类的路径)
scope:新建对象的范围
给实体类属性赋值
<jsp:setProperty property="*" name="key" />
property":表示给哪个属性赋值 如果实体类的属性值和页面提交过来的key值一一对应的话
则可以使用*表示所有属性
name:对应usebean标签的id属性
<jsp:setProperty property="name" name="key"/>
单独给name赋值
<jsp:setProperty property="*" name="key" param="myname" />
param:当key值与实体类属性值不对应时使用
<jsp:setProperty property="name" name="key" value="设置好的name值"/>
value:不管传过来的是什么,都会把value的值赋值给property
使用标签进行请求转发
<jsp:forward page="jsp/jsp"></jsp:forward>
里面可以进行传递参数
<jsp:forward page="jsp/jsp">
<jsp:param value="value" name="key" />
</jsp:forward>
使用标签进行重定向
<c:redirect url="jsp.jsp"></c:redirect>
里面可以传递参数
<c:redirect url="jsp.jsp">
<c"param name="key" value="value" />
</c:redirect>
jsp內建动作中usebean这个标签肯定是创建新的对象吗
不是
首先根据ID提供的key值和scope提供的范围从内存中拿取 如果可以拿取就使用拿取的
如果无法拿取 则重新创建一个新的对象 并赋值范围
这里受范围的局限性影响
pageContext 肯定创建一个新的对象
request 重定向会创建新的对象
session 超过最大不活动周期或者session销毁 会创建新的对象
application 永远不会创建新对象(因为只有Tomcat关闭才会销毁 但是tomcat关闭后没法创建对象)
分页
分页的种类
假分页
一次将所有数据取出 用户需要哪些数据就显示哪些数据,耗资源 数据少可以使用,效率较高
真分页
用户需要哪些数据就从数据库中取出哪些数据
分页公式(MySQL)
select 字段 from 表 limit x,y;
x:起始索引值
y:显示几条记录
分页四要素
1 总记录数 固定的
2 每页记录数 自己设置
3 总页数 (总记录数+每页记录数-1)/每页记录数
4 当前页 默认是1 此参数是变量
分页四要素分页公式
select 字段 from 表 limit (当前页-1)*每页记录数,每页记录数;
分页提交表单时,提交本页面使之不断刷新当前页的值
使用隐藏域进行当前页值的传递
遍历表单时使用标签<c:forEach></c:forEach>
<%=aabb==ccdd?"disabled":"" %>
如果aabb和ccdd相等的话 会使按钮失效
JSP中九个内置对象
java形式:pageContext、erquest、session、application、config、out、page、exception
EL表达式:${pageContext}、${pageContext.request}、${pageContext.session}
${pageContext.servletContext}、${pageContext.response}、${pageContext.servletConfig}
${pageContext.out}、${pageContext.page}${pageContext.exception}
文件上传
<form action="servlet/Upload" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="up" />
<br>
<input type="submit" value="上传" />
</form>
上传操作必须使用post enctype:设置表单上传时流的类型
multipart/form-data表示使用字节流
application/x-www-form-urlencoded表示使用字符流
使用第三方插件SmartUpload对文件进行上传操作一共需要五步
1、SmartUpload
SmartUpload su = new SmartUpload();
2、设置上传的文件后缀名 逗号隔开 区分大小写
su.setAllowedFilesList("jpg,JPG,JPEG,jpeg,gif,txt");
3、设置上传的大小
su.setTotalMaxFileSize(6*1024*1024);//大小为6M
4、初始化 表示SmartUpload接管整个Servlet 再次从页面接受请求时 不再使用Servlet自己的request
su.initialize(getServletConfig(),request,response);
5、上传文件
su.upload();
拿取所有上传的文件
Files files = su.getFiles();
拿取唯一上传的文件对象
File file = files.getFile(0);
拿取文件全名
String fileName = file.getFileName();
拿取文件后缀名
String fileExt = file.getFileExt();
拿取文件大小
int fileSize = file.getSize();
设置文件另存为的地址
String path = "路径/"+newName;
另存到此路径
file.saveAs(path);
设置SmartUpload自己的request
Request req = su.getRequest();
String name = req.getParameter("name");
将参数全部封装进实体类
Uploader up = new Uploader(null,name,path);
加入范围
request.setAttribute("key",up);
请求转发
request.getRequestDispatcher("../show.jsp").forward(request, response);
下载文件
设置下载到路径 如果为null 则有浏览器提示用户选择下载位置
su.setContentDisposition(null);
初始化
su.initialize(getServletConfig(), request, response);
下载文件
su.downloadFile(路径);
1.什么是JSP?
JSP—Java Server Page。从用户角度看其实就是就是一个网页;从程序员角度看待,他其实就是一个Java类。它继承了servlet,所以可以说jsp就是一个servlet。
2.为什么会有JSP?
HTML多数情况下用来显示静态内容,是一成不变的。但是有时我们需要在网页上显示一些动态数据。比如:查询所有学生的信息,根据姓名去查询具体的某个学生。这些都需要查询数据库,然后在网页上显示。HTML不支持写java代码,但是jsp里面可以写java代码。
3.指令写法
<%@ 指令名字 %>
4.page指令
①language
表明jsp页面中可以写java代码
②contentType
表明这个文件是什么类型,告诉浏览器自己是什么内容类型,以及使用什么编码
contentType="text/html;charset=UTF-8";
③pageEncoding
jsp内容编码
④extends
用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改
⑤import
导包使用的,一般不用手写
⑥session
值可选的有true和false。用于控制在这个jsp页面里面,能够直接使用的session对象具体的区别——请看翻译后的java文件。如果该值是true,那么在代码里面会有getSession()的调用,如果是false,则不会有该方法调用,也就是没有session对象了,在页面上自然也不能使用session了。⑦errorPage
指的是错误的页面,值需要给错误的页面路径
⑦isErrorPage
errorPage 用于指定错误的时候跑到哪一个页面去,isErroPage 就是声明某一个页面到底是不是错误的页面。
5.include
<%@ include file="other.jsp"%>
把另外一个页面的所有内容拿过来一起输出。所有的标签元素都包含进来。
6.taglib
<%@ taglib prefix="" uri =""%>
uri:标签库路径
prefix:标签库的别名
7.JSP动作标签
<jsp:include page=""></jsp:include>
<jsp:param value=“”value=""/>
<jsp:forward page=""></jsp:forward>
jsp:include<jsp:include page="other.jsp"></jsp:include>包含指定的页面,这里是动态包含。也就是不把包含的页面的所有元素标签全部拿出来输出。而是把它的运行结果拿过来。jsp:forward<jsp:forward page=""></jsp:forward>请求转发:request.getRequestDispatcher("other.jsp").forward(request,response);jsp:param意思是:在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数。<jsp:forward page="other.jsp"><jsp:param value="beijing" name ="address"></jsp:forward>在other.jsp中获取参数
<br>收到的参数是:</br>
<% =request.getParameter("address")%>
8.JSP内置对象(重要)
所谓内置对象,就是我们可以直接在jsp页面中使用这些对象,不用创建。
①pageContext
②request
③session
④application
这是4个作用域对象
使用作用域来存储数据
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
取出四个作用域中的值<br>
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>
作用域范围大小
pageContext ---request ---session ---application
9.四个作用域的区别(重要)九个内置对象
①pageContext【PageContext】
作用域仅限于当前的页面,还可以获取到其他八个内置对象
②request【HttpServletRequest】
作用域仅限于一次请求,只要服务器对该请求作出了响应。这个域中的值就没有了
③session【HttpSession】
作用域仅限于一次会话(多次请求与响应)当中
④application【ServletContext】
整个工程都可以访问。关闭服务器后就不能访问了
⑤out【JspWriter】
⑥response【HttpServletResponse】
⑦exception【Throwable】
⑧page【Object】
就是这个jsp翻译成的java类的实例对象
⑨config【ServletConfig】
jsp技术作为曾经一度火爆的技术,在最近几年确实使用率越来越低了,这篇文章带你一块探究一下jsp的从生到死。
一、jsp技术的诞生
在很久很久以前,那时候我们的开发都是通过servlet来完成的,这个servlet是什么呢?我们先来认识一下:
servlet用Java语言编写的服务器端程序。主要功能是和浏览器进行交互,生成页面展示。
代码长下面这个样子:
我们可以看到前端所展示的页面,需要我们servlet去一个标签一个标签去生成,如果一个页面超级复杂,动不动几千行代码,那这个servlet效率也就太低了。而且整个servlet代码也会十分臃肿而且可读性非常差。
这时候怎么办呢?sun公司很早就意识到了这个问题,于是便倡导很多公司一块来创建了一种能够动态生成html的新技术,不久之后jsp便诞生了。有效率的解决了上面servlet所出现的问题。
二、jsp的发展
既然jsp技术能够解决刚刚servlet代码里面所出现的技术,我们来看一下是如何解决的:在这里我们举一个小例子,就是前端jsp向服务器servlet发送请求图书页面的功能。
首先我们看一下servlet:
我们会发现,现在的servlet没有一点html代码了。我们只需要把数据交给jsp。此时我们的页面展示就交给jsp来做了。现在我们来看一下jsp长什么样子:
这就是jsp,我们可以在html页面中写一些java代码。对于我们程序员来说,在开发当中静态的页面我们只需要用html和css写一些标签来展示即可,对于那些动态的部分我们就可以使用java代码。
那么jsp和servlet是不是就是这种协作的关系,本质上有什么区别呢?
其实jsp只是servlet的一种特殊形式,每一个jsp页面就是一个servlet实例,通俗一点的话来说:jsp就是servlet,只不过servlet把一些业务功能剥离开来交给了或者是形成了jsp。明白了吧。在我们的项目编译的时候就是把jsp编译成了servlet。
你们会发现,这样做其实挺好的,市场也验证了一切,很快jsp技术流行开来,可是随着时间的流逝,业务越来越复杂,jsp也开始跟不上时代了。
三、jsp的危机
我们先看一个对话场景:
java程序员:终于写完了功能,是时候在界面上展示了
前端程序员:你功能写完了,我没有数据,在页面什么没法展示呀
java程序员:数据我写好了,你在jsp中调用XX方法就能获取了,
前端程序员:我已经在jsp中写好了这个方法,你为什么自己写了?
于是乎,无穷无尽的争吵还在继续当中。
这就是jsp的弊端,为什么呢?我们可以来总结一下:
(1)动态和静态资源放在一起,一旦服务器出现状况,前后台一起玩完,用户体验极差。
(2)一旦jsp出现了问题,就需要前端后端发开人员一块来分析解决,效率低。
(3)jsp无法使用nginx等。
(4)jsp页面复杂,难以修改。
(5)第一次加载jsp需要编译成servlet,时间久,而且业务量大的时候,jsp负担太大。
(6)jsp对于开发人员简直就是一个挥之不去的痛,太难了!!!
鉴于以上缺点,于是另外一套机制横空出世了,这就是前后端分离。什么是前后端分离呢?
前后端分离其实就是后端工程师只关注于后端页面的开发,不再处理前端问题。前端工程师只关注于自己的页面开发。需要数据交互的时候,两者会有一份接口文档。
就这样这种思想架构很快的流行开来,这也就是为什么jsp落寞的真正原因。从此java从jsp转向了restful结构,springMCV也开始流行开来,并逐渐占领了市场。前后端分离有什么优点呢?我们来总结一下:
(1)动态和静态资源分开存储。
(2)出现bug能很快定位是前端还是后端。
(3)支持nginx。在高并发状态下极其优秀。
(4)直接请求页面,不用编译,速度效率都提上来了。
(5)从此前端和后端是相亲相爱的一家人了!!!!
四、jsp的落幕
又随着时间的推移,jsp的时代基本上一去不复返了,因为我们又走入了移动互联时代,这时候的客户端可不是前端页面了,还包括手机、汽车、电视等等各种设备,这种情况下,前后端必须要分离了。jsp基本上彻底告别了它的舞台。
技术总是在不断地发展和完善,只有技术的革新才会带来社会的进步。