JavaWeb之jsp速通
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb之jsp速通相关的知识,希望对你有一定的参考价值。
1.JSP
概念:Java Server Pages, java服务器端页面
- 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
- 用于简化书写!!!
原理:
- JSP本质上就是一个Servlet
1.1JSP的脚本
JSP的脚本:JSP定义Java代码的方式
第一种: <% %> java脚本段,可以定义局部变量、编写语句
第二种: <%! %> 声明,可以定义全局(成员)变量、方法、类
第三种: <%= %> 表达式,数据一个变量或具体内容
1.2JSP的指令
作用:用于配置JSP页面,导入资源文件
格式:
<%@ 指令名称 属性名1 = 属性值1 属性名2 = 属性值2 ...%>
分类:
- page : 配置JSP页面的
- include: 页面包含的。导入页面的资源文件
- taglib : 导入资源
1.2.1 page指令
- contentType:等同于
response.setContentType()
设置响应体的mime类型以及字符集
<%@ page contentType="text/html;charset=UTF-8" %>
- import 导包
<%@ page import="java.util.ArrayList" %>
- errorPage : 当前页面发生异常后,会自动跳转到指定的错误页面
<%@ page contentType="text/html;charset=UTF-8" errorPage="500.jsp" %>
- isErrorPage : 标识当前页面是否是错误页面
- true:是,可以使用内置对象exception
- false:否。默认值。不可以使用内置对象exception
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
1.2.2 include指令
- include : 页面包含的。导入页面的资源文件
<%@include file="top.jsp"%>
1.2.3taglib指令
- taglib : 导入资源
1.3注释
在JSP中支持两种注释的语法操作
- 一种是显示注释,这种注释是允许客户端看见的;
- 显示注释语法:从HTML风格继承而来
- 另一种是隐式注释,此种注释是客户端无法看见的
- 隐式注释语法:从JAVA风格继承,JSP自己的注释
JSP注释方法
1. html注释:
<!-- -->:只能注释html代码片段
2. jsp注释:推荐使用
<%-- --%>:可以注释所有
1.4内置对象
内置对象:在jsp页面中不需要创建,直接使用的对象
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
2.MVC开发模式
jsp演变历史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦
- 后来有jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又写html表,造成难于维护,难于分工协作
- 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
MVC:
- M:Model,模型。JavaBeans
- 完成具体的业务操作,如:查询数据库,封装对象
- V:View,视图。JSP
- 展示数据
- C:Controller,控制器。Servlet
- 获取用户的输入
- 调用模型
- 将数据交给视图进行展示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7H3XxZX-1620637026304)(JSP&itcast.assets/image-20210503195933692.png)]
优缺点:
优点:耦合性低,方便维护,可以利于分工协作,重用性高
缺点:使得项目架构变得复杂,对开发人员要求高
3.EL表达式
-
概念:Expression Language 表达式语言
-
作用:替换和简化jsp页面中java代码的编写
-
语法:
${表达式}
-
注意:
-
jsp默认支持el表达式的。如果要忽略el表达式
-
设置jsp中page指令中:
isELIgnored="true"
忽略当前jsp页面中所有的el表达式 -
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
-
\\${表达式} :忽略当前这个el表达式
-
\\${3 > 4 }
-
-
3.1EL表达式的使用
运算符
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
${empty list}
:判断字符串、集合、数组对象是否为null或者长度为0${not empty str}
:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
<%--
比较两个值是否相等,返回 true 或者 false
== 或者 eq
--%>
${a == b}
${c == d}
${c eq d}
3.1.1获取值
- el表达式只能从域对象中获取值
- 语法
- ${域名称.键名}:从指定域中获取指定键的值
- 域名称
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
- 举例:在request域中存储了name=张三
- 获取:
${requestScope.name}
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
3.1.2获取对象
- 获取对象、List集合、Map集合的值
-
对象:
${域名称.键名.属性名}
-
本质上会去调用对象的getter方法
-
${requestScope.user.name}
-
-
List集合:
${域名称.键名[索引]}
-
${list[2].name}
-
-
Map集合:
${域名称.键名.key名称}
${域名称.键名["key名称"]}
${map.user.name}
${map.user.["name"]}
3.1.3隐式对象
- el表达式中有11个隐式对象
pageContext
:- 获取jsp其他八个内置对象
${pageContext.request.contextPath}
:动态获取虚拟目录
4.JSTL
-
概念:JavaServer Pages Tag Library JSP标准标签库
- 是由Apache组织提供的开源的免费的jsp标签 <标签>
-
作用:用于简化和替换jsp页面上的java代码
-
使用步骤:
-
导入jstl相关jar包
-
此时需要导入两个 jar 包
-
jstl.jar
-
standard.jar
-
下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
-
下载 jakarta-taglibs-standard-1.1.2.zip
-
解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件standard.jar 和 jstl.jar 文件拷贝到项目的指定目录下
-
-
引入标签库:taglib指令: <%@ taglib %>
-
使用标签
-
我们现在只讨论JSTL中最重要的标签,迭代集合以及格式化数字和日期几个标签
核心标签库:
-
http://java.sun.com/jsp/jstl/core
-
包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
格式化标签库:
-
http://java.sun.com/jsp/jstl/fmt
-
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
-
为了在JSP页面使用JSTL类库,必须以下列格式使用 taglib 指令
<%@taglib prefix = "" uri = "" %>
- 例如
<%@taglic prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
4.1常用的JSTL标签
if : 相当于java代码的if语句
- 属性:
- test 必须属性,接受boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- 注意:
- c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
<body>
<c:if test="">我是真的皮</c:if>
<h1>test属性结合el表达式一起使用</h1>
<c:if test="${not empty list}">
遍历集合....
</c:if>
</body>
choose:相当于java代码的switch语句
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
- 使用otherwise标签做其他情况的声明 相当于default
<c:choose>
<c:when test="${number == 1}">星期一</c:when>
<c:when test="${number == 2}">星期二</c:when>
<c:when test="${number == 3}">星期三</c:when>
<c:when test="${number == 4}">星期四</c:when>
<c:when test="${number == 5}">星期五</c:when>
<c:when test="${number == 6}">星期六</c:when>
<c:when test="${number == 7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>
foreach:相当于java代码的for语句
5.三层架构:软件设计架构
- 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
- 业务逻辑层:处理业务逻辑的。
- 数据访问层:操作数据存储文件。
6.过滤器Filter
概念:
- 生活中的过滤器:净水器,空气净化器
- web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
过滤器的作用:
- 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤
6.1快速入门
步骤:
- 定义一个类,实现接口
Filter
- 复写方法
- 配置拦截路径
- web.xml
- 注解
/**
* 过滤器快速入门程序
*/
//@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被执行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
6.2过滤器细节
可以用注解配置拦截路径,也可以在web.xml设置拦截路径
web.xml
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器执行流称
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
过滤器生命周期方法
init
:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源doFilter
:每一次请求被拦截资源时,会执行。执行多次destroy
:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
过滤器配置详解
- 拦截路径配置:
- 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
- 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
- 拦截方式配置:资源被访问的方式
- 注解配置:设置
dispatcherTypes
属性- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- 注解配置:设置
// 浏览器直接请求index.jsp资源时,该过滤器会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
// 只有转发访问index.jsp时,该过滤器才会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})
2. web.xml配置:设置<dispatcher></dispatcher>
标签即可
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
<dispatcher>REQUESR</dispatcher>
</filter-mapping>
过滤器链(配置多个过滤器)
-
执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
-
过滤器先后顺序问题:
-
注解配置:按照类名的字符串比较规则比较,值小的先执行
如: AFilter 和 BFilter,AFilter就先执行了。
-
web.xml配置:
<filter-mapping>
谁定义在上边,谁先执行
-
7.监听器Listener
概念:web的三大组件之一 (Servlet,Listener,Filter)
事件监听机制
- 事件 :一件事情
- 事件源 :事件发生的地方
- 监听器 :一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
7.1快速入门
ServletContextListener
:监听ServletContext对象的创建和销毁
方法:
void contextDestroyed(ServletContextEvent sce)
:ServletContext对象被销毁之前会调用该方法void contextInitialized(ServletContextEvent sce)
:ServletContext对象创建后会调用该方法
步骤
-
定义一个类,实现ServletContextListener接口
-
复写方法
-
配置
- web.xml
<listener> <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class> </listener> <!--指定初始化参数<context-param>--> <context-param> <param-name>***</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param>
- 注解:@WebListener
void contextDestroyed(ServletContextEvent sce)
:ServletContext对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce)
:ServletContext对象创建后会调用该方法
步骤
-
定义一个类,实现ServletContextListener接口
-
复写方法
-
配置
- web.xml
<listener> <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class> </listener> <!--指定初始化参数<context-param>--> <context-param> <param-name>***</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param>
- 注解:@WebListener
以上是关于JavaWeb之jsp速通的主要内容,如果未能解决你的问题,请参考以下文章