JSP,EL和JSTL
JSPJSP基础语法jsp中既可以写java代码,也可以写html等静态代码,其本质就是一个servlet指令作用: 用于配置jsp页面, 以及导入一些资源文件.格式: <%@ 指令名称 属性名1=属性值1 属性名1=属性值1 …%>分类:page: 配置jsp页面.contentType: 等同于response.setContentType()这个方法....
JSP
JSP基础语法
jsp中既可以写java代码,也可以写html等静态代码,其本质就是一个servlet
- 指令
- 作用: 用于配置jsp页面, 以及导入一些资源文件.
- 格式: <%@ 指令名称 属性名1=属性值1 属性名1=属性值1 …%>
- 分类:
- page: 配置jsp页面.
- contentType: 等同于response.setContentType()这个方法.
- 可以用于设置响应体的mime类型和字符集.
- 设置当前jsp页面的编码(只能是高级的ide才能生效,如果使用记事本这样的低级开发工具,那就需要使用pageEncoding()来设置).
- import: 用来导java包,和java中导包一样.
- errorPage: 当前页面发生异常后,会自动跳转到指定的错误页面,
- 例如:
<%@page errorPage="index.jsp" %>
,注意这个errorPage不能是当前页面,必须是其它的jsp页面.
- 例如:
- isErrorPage: 标示当前页面是否是错误页面,默认为false,但是,标示当前页面的isErrorPage为true之后,就可以使用内置对象exception了.
- isErrorPage示例代码
- contentType: 等同于response.setContentType()这个方法.
- include: 页面包含的,导入页面的资源文件,比如我这个页面值写头部,其它页面要这个头部的时候直接包含进去就可以了.
- <%@include file=“top.jsp”%>
- taglib: 导入资源,一般用于导入标签库,相当于导包.
- <%@taglib prefix=“a” uri=“http://java.sun.com/jsp/jstl/core”%>
- prefix: 前缀,自定义的名字这个标签的名字.
- uri: 标签库的url.
- page: 配置jsp页面.
- 注释
- html注释: : 只能注释html代码片段,注释的东西你再浏览器中查看源码还是可以看到.
- jsp特有的注释
<%-- --%>: 可以注释所有(推荐使用,注释的东西就不会发送到浏览器,相当于删除了)
- 内置对象
- 在jsp页面中不需要创建可以直接使用的对象,一共有9个.
- pageContext(jsp中的域对象),真实类型为PageContext,其作用范围为: 当前页面,可以在当前页面共享数据,还可以获取其它八个内置对象(通过get方法).
<% request.setAttribute("msg", "hello"); %> <%= request.getAttribute("msg")%>
- request(jsp中的域对象),真实类型为HttpServletRequest,其作用范围为: 一次请求访问的多个资源(通过转发实现).
- session(jsp中的域对象),真实类型为HttpSession,其作用范围为: 一次会话的多个请求间.
- application(jsp中的域对象),真实类型为ServletContext,其作用范围为: 所有用户间共享数据,服务器开启被创建,服务器关闭被销毁.
- response,真实类型为HttpServletResponse,其作用为: 作为一个响应对象.
- page,代表当前对象,等于this,真实类型为Object,其作用为: 表示当前页面(servlet)的对象 this.
- out,真实类型为JspWriter,其作用为: 输出对象,将数据输出到页面上.
- config,真实类型为ServletConfig,其作用为: 作为servlet的配置对象.
- exception(要声明该页面为isErrorPage=true才能使用),真实类型为Throwable,其作用为: 作为一个异常对象.
MVC开发模式(知道什么代码往哪儿写,很重要)
-
jsp的演变历史
- 早期只有servlet,没有jsp,只能使用response输出标签数据,非常麻烦.
- 后来就有了jsp,简化了servlet的开发,但是如果过度使用jsp,在jsp中既写大量代码,又写一堆html标签,后期很难维护,别人也看不懂.
- 再后来,Java的web开发就借鉴了mvc的开发模式,使得程序的设计更加合理.
-
MVC详解
- M: Model, 模型.JavaBean
- 完成具体的业务操作,如: 查询数据库(对数据库的操作都放在Dao包下),封装对象.
- V: View, 视图. JSP
- 仅展示数据,就不写java代码了尽量.
- C: Controller, 控制器. Servlet
- 获取用户输入.
- 调用模型.
- 将数据(包括用户输入的和模型返回的)交给视图进行展示.
- 优点
- 耦合性低,所以方便维护,有利于分工协作.
- 重用性高.
- 缺点: 使项目架构变得复杂,对程序猿的要求更高,要有一个很完整的构思.
- 如图: .
- M: Model, 模型.JavaBean
EL表达式(简化JSP中java开发代码)
- 概念: Expression Language 表达式语言.
- 作用: 替换和简化jsp页面中java代码的编写,注意它只能获取域中的数据,所以所有要使用el表达式的都需要先存到域对象中.
- 语法: ${表达式}.
- 注意:
- jsp默认支持EL表达式.
- 如果要忽略EL表达式,即将EL表达式当作普通字符串输出,有两种方法:
- 设置jsp中的page指令中的isELIgnored属性为true,即
<%@page isELIgnored="true" %>
,表示忽略当前jsp页面中所有的EL表达式,这样整个页面的EL表达式都会被当作字符串处理. - 在EL表示式前加一个反斜杠
\
就可以了,例如\${3 > 4}
,表示忽略当前这个EL表达式.
- 设置jsp中的page指令中的isELIgnored属性为true,即
- 作用:
-
运算
- 运算符
- 算术运算法: + - * /(div) %(mod),注意除法后默认是double类型.
- 比较运算符: > < >= <= ==.
- 逻辑运算符: &&(and) ||(or) !(not).
- 空运算符: empty,用于判断字符串,集合,数组对象是否为null并且长度是否为0.
- 例如: ${empty list},判断list对应的字符串,集合,数组对象是否为空或者长度为0,满足一个就返回true.
- ${not empty list},判断字符串,集合,数组对象是否不为null并且长度>0,满足则返回true.
- 案例代码: 运算符示例代码.
- 运算符
-
获取值(通过属性获取值,越界时候输出都是空字符串,不会报错)
注意这里的属性就是get和set方法去掉get和set,剩下的部分再将首字母小写,即getAge()–>age属性.
- EL表达式只能从域对象中获取值.
- 语法:
- ${域名称.键名称}: 从指定域中获取指定键的值.
- 域(4个):
- pageScope —> pageContext.
- requestScope —> rquest.
- sessionScope —> session.
- applicationScope —> application(即java中的servletContext).
- 举例: 在request中存储了name=饭饭,通过
${requestScope.name}
就可以得到张三.
- 域(4个):
- ${键名}: 表示依次从最小的域
pageContext
开始查找是否有该键对应的值,知道找到为止.
- ${域名称.键名称}: 从指定域中获取指定键的值.
- 获取对象, List集合, Map集合的值
- 获取对象: ${域名称.键名.属性名}.
- 本质上是用对象去调用对应的get方法.
- List集合: ${域名称.键名称[索引]}.
- 比如说当索引为0,表示获取该集合中的第一个元素.
- 没有索引就输就所有值.
- 下标越界就输出空字符串,不会报错.
- Map集合: 域 名 . 键 名 . k e y 名 或 者 {域名.键名.key名}或者 域名.键名.key名或者{域名.键名[key名]}.
- 获取对象中的数据案例代码.
- 获取对象: ${域名称.键名.属性名}.
-
隐式对象: 可以直接拿来用,类似于jsp的内置对象,el表达式中有11个隐式对象.
- 这里注意一下pageContext就可以了:
- 可以获取jsp其它八个内置对象.
- 可以动态获取虚拟目录: p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h , 可 以 用 在 j s p 页 面 的 f o r m 表 单 中 , 例 如 : a c t i o n = " {pageContext.request.contextPath},可以用在jsp页面的form表单中,例如: action=" pageContext.request.contextPath,可以用在jsp页面的form表单中,例如:action="{pageContext.request.contextPath}/loginServlet".
- 这里注意一下pageContext就可以了:
-
JSTL标签(简化JSP中java开发代码)
-
概念: Java Server Pages Tag Library 即JSP标准标签库
- 是由Apache阿帕奇组织提供的开源的免费的jsp标签库 <标签>.
-
用于简化和替换jsp页面上的java代码.
-
使用步骤:
- 导入jstl相关的jar包.
- 引入标签库: taglib指令 <%@ taglib %>
- 使用标签.
这里在运行的时候我遇到了一个错The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application
,这个错就是项目在部署的时候jstl的jar包在tomcat下的WEB-INF的lib中没得,将jar包复制到目录下就行了
- 常用的jstl标签
-
if,相当于java中的if,但是没有else.
- 属性
- test, 必须属性,接收boolean表达式,
- 如果表达式为true,则显示if标签体内容
- 如果表达式为false,则不显示if标签体内容
- 如果表达式什么都不是也不会显示if标签体内容
- 一般情况下,test属性值会结合el表达式的empty运算符,比较运算符,逻辑运算符等一起使用.
- test, 必须属性,接收boolean表达式,
- 注意: c:if标签没有else情况,想要else情况,就要重写一遍c:if标签.
- 属性
-
choose,相当于java中的switch.
- choose标签写一个星期几小案例
- 在域中存储一个数字.
- 使用choose标签取出数字 相当于switch的声明.
- 使用when标签做数字的判断,相当于case,
<c:when test="${number == 1}">
. - otherwise标签做其它情况的声明,相当于default,
<c:otherwise>
.
- choose标签写一个星期几小案例
-
foreach,相当于java中的for循环.
- 属性:
- items: 容器对象
- var: 容器中的临时变量
- varStatus: 循环状态对象
- index: 容器中元素的索引,从0开始
- count: 循环次数,从1开始
- 属性:
-
练习:
- 需求: 在request域中有一个存有user对象的list集合,需要使用jstl+el将list集合数据展示到jsp页面的表格中.
- 练习代码.
-
三层架构(针对服务器而言): 软件设计架构
- 界面层(表示层): 即用户看到的界面,用户可以通过界面上的组件和服务器进行交互例如将数据封装提交.
- 业务逻辑层: 处理业务逻辑的.
- 数据访问层: 操作数据存储文件,如数据库,txt文件等.
- 针对web服务器而言,上述三层架构又叫web层, service层, dao(data access object)层.
- 其关系如图: .
案例: 用户信息列表展示
1. 需求: 用户信息的查询操作
2. **[用户信息展示_查询代码]()**.
综合案例练习
1. 简单功能
1. 列表查询(就是上面的,我是直接复制过来的).
2. 登录.
3. 列表添加.
4. 列表删除.
5. 列表修改.
2. 复杂功能
1. 删除选中的多条信息.
2. 数据分页查询.
3. 复杂条件查询.
3. [案例完整代码](https://github.com/fanfan999/WebCodes/tree/master/user_crud_complete).
更多推荐
所有评论(0)