Servlet 的短板:
Servlet 的出现,是为了解决动态输出网页的问题。
虽然这样做目的能达到,但是存在一些缺陷:
责任分离
MVC 模式
既然 Servlet 和 JSP 都有各自的优势和短板,那么为什么不结合起来扬长避短呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
1.Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
2.Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
3.Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
4.动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。
org.apache.jasper.runtime.HttpJspBase
类的 Servlet 源程序,接着再编译成 class 类文件,再由 Web 容器像调用普通 Servlet 程序一样的方式来装载和解释执行这个由 JSP 页面翻译成的 Servlet 程序。详细资料在这里,感兴趣的戳我
像这样冗杂繁复的知识点,直接给两个好一点的链接记下就好了:
1.W3Cschool
2.菜鸟教程
——【page指令】——
*
import:导入JSP中的Java脚本使用到的类或包。(如同Java中的import语句)javax.servlet.*
javax.servlet.http.*
javax.servlet.jsp.*
*
sessioin:指示JSP页面是否创建 HttpSession 对象。默认值是true,创建*
buffer:指示 JSP 用的输出流的缓存大小.默认值是8Kb。*
errorPage:指示当前页面出错后转向(转发)的页面。> 配置全局错误提示页面:
> web.xml 文件中添加:
java.lang.Exception
/error.jsp
404
/404.jsp
9.*
isErrorPage:指示当前页面是否产生 Exception 对象。
10.*
contentType:指定当前页面的 MIME 类型。作用与 Servlet 中的response.setContentType()
作用完全一致
11.*
pageEncoding:通知引擎读取 JSP 时采用的编码(因为要翻译)
12.*
isELIgnored:是否忽略EL表达式。${1+1}。默认值是false。
<%@ page pageEncoding="UTF-8"%>
——【include】——
<%@include file=""%>
静态包含和动态包含的区别:
静态包含:<%@include file="被包含的页面的路径"%>
包含的时机:在 JSP 文件被翻译的时候合并在一起
最终会被翻译成一个 class 文件
总结:在实际开发中,能用静的就别用动的
——【taglib】——
<%@taglib uri="标签名称空间" prefix="前缀"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
内置对象:JSP 中事先创建好的对象,可以直接拿来使用
名称 | 类型 | 描述 |
---|---|---|
pageContext | PageContext | 表示当前的JSP对象 |
request | HttpServletRequest | 表示一次请求对象 |
session | HttpSession | 表示一次会话对象,session="true" |
application | ServletContext | 表示当前应用对象 |
response | HttpServletResponse | 表示一次响应对象 |
exception | Throwable | 表示异常对象,isErrorPage="true" |
config | ServletConfig | 表示当前JSP的配置对象 |
out | JspWriter | 表示一个输出流对象 |
page | Object | 表示当前页面 |
名称 | 类型 | 描述 |
---|---|---|
pageContext | PageContext | 表示当前的JSP对象 |
request | HttpServletRequest | 表示一次请求对象 |
session | HttpSession | 表示一次会话对象,session="true" |
application | ServletContext | 表示当前应用对象 |
abstract Object findAttribute(String name)
来获取共享数据,从page,request,session,application作用域中按顺序搜索,如果找到立即返回,反之,返回null所以我们可以这样来完成要求:<%=pageContext.findAttribute("msg")==null?"":pageContext.findAttribute("msg") %>
这样的代码虽然能够完成需求,但是总的来说:太麻烦!
如果我们使用 EL 表达式,该如何实现呢?${msg}
等价于<%=pageContext.findAttribute("msg")==null?"":pageContext.findAttribute("msg") %>
这样看起来就简单多了!
EL的特点:
1.从作用域中获取共享数据
2.从page,request,session,application作用域中按顺序搜索
3.如果共享数据为null,就输出空字符串(这是EL最重要的特点)
使用EL表达式从指定的作用域中获取共享数据:
使用EL表达式访问对象的属性的两种方式:
1.${对象.属性名} :通常使用这种方式,属性名比较规范
2.${对象[“属性名”]} :当属性名不规范的时候使用这种方式,比如:name-age
${pageContext.request.contextPath}
${pageContext.getRequest().getContextPath()}
empty 运算符:
empty 运算符主要用来判断值是否为空(NULL,空字符串,空集合),返回 true / false
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
下面列出 JSTL 主要提供的 5 大类标签库(搬自菜鸟教程),先对这些标签初步有一个印象,然后下面给一些常用的标签的一些用法。
JSTL 核心标签
核心标签是最常用的JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
|
用于在JSP中显示数据,就像<%= ... > |
|
用于保存数据 |
|
用于删除数据 |
|
用来处理产生错误的异常状况,并且将错误信息储存起来 |
|
与我们在一般程序中用的if一样 |
|
本身只当做和的父标签 |
|
的子标签,用来判断条件是否成立 |
|
的子标签,接在标签后,当标签判断为false时被执行 |
|
检索一个绝对或相对 URL,然后将其内容暴露给页面 |
|
基础迭代标签,接受多种集合类型 |
|
根据指定的分隔符来分隔内容并迭代输出 |
|
用来给包含或重定向的页面传递参数 |
|
重定向至一个新的URL. |
|
使用可选的查询参数来创造一个URL |
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt" %>
标签 | 描述 |
---|---|
|
使用指定的格式或精度格式化数字 |
|
解析一个代表着数字,货币或百分比的字符串 |
|
使用指定的风格或模式格式化日期和时间 |
|
解析一个代表着日期或时间的字符串 |
|
绑定资源 |
|
指定地区 |
|
绑定资源 |
|
指定时区 |
|
指定时区 |
|
显示资源配置文件信息 |
|
设置request的字符编码 |
SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql"
uri="http://java.sun.com/jsp/jstl/sql" %>
标签 | 描述 |
---|---|
|
指定数据源 |
|
运行SQL查询语句 |
|
运行SQL更新语句 |
|
将SQL语句中的参数设为指定值 |
|
将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
|
在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@ taglib prefix="x"
uri="http://java.sun.com/jsp/jstl/xml" %>
在使用xml标签前,你必须将XML 和 XPath 的相关包拷贝至你的\lib下:
XercesImpl.jar
下载地址: http://www.apache.org/dist/xerces/j/
xalan.jar
下载地址: http://xml.apache.org/xalan-j/index.html
标签 | 描述 |
---|---|
|
与<%= ... >,类似,不过只用于XPath表达式 |
|
解析 XML 数据 |
|
设置XPath表达式 |
|
判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
|
迭代XML文档中的节点 |
|
和的父标签 |
|
的子标签,用来进行条件判断 |
|
的子标签,当判断为false时被执行 |
|
将XSL转换应用在XML文档中 |
|
与共同使用,用于设置XSL样式表 |
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn"
uri="http://java.sun.com/jsp/jstl/functions" %>
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |
JSTL 中常用的标签
1.逻辑判断标签(if,choose-when-otherwise)
...
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | page |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:if 标签实例
我的工资为:
运行结果如下:
我的工资为: 4000
, ,
标签
标签与 Java switch 语句的功能一样,用于在众多选项中做出选择。
标签中对应有
,switch语句中有 default,而
标签中有
。
...
...
...
...
...
标签没有属性。
标签只有一个属性,在下表中有给出。
标签没有属性。
标签的属性如下:属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:choose 标签实例
你的工资为 :
太惨了。
不错的薪水,还能生活。
什么都没有。
运行结果如下:
你的工资为 : 4000
不错的薪水,还能生活。
2.循环遍历标签(foreach)
...
标签有如下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的信息 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:forEach 标签实例
Item
运行结果如下:
Item 1
Item 2
Item 3
Item 4
Item 5
3.在 JSP 中实现日期的格式化:
标签
标签有如下属性:属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
JSTL fmt:dateNumber 标签
日期格式化:
日期格式化 (1):
日期格式化 (2):
日期格式化 (3):
日期格式化 (4):
日期格式化 (5):
日期格式化 (6):
日期格式化 (7):
以上实例运行结果:
日期格式化:
日期格式化 (1): 11:19:43
日期格式化 (2): 2016-6-26
日期格式化 (3): 2016-6-26 11:19:43
日期格式化 (4): 16-6-26 上午11:19
日期格式化 (5): 2016-6-26 11:19:43
日期格式化 (6): 2016年6月26日 上午11时19分43秒
日期格式化 (7): 2016-06-26
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz