乐视网站建设目标,哈尔滨建设发展集团,做视频的网站那几个盈利了,做公司+网站建设文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言
不得不说#xff0c;JSP 现在已经是一门十分老旧的技术了#xff0c;学习编程时#xff0c;不仅…
文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言
不得不说JSP 现在已经是一门十分老旧的技术了学习编程时不仅要学习优秀的前言技术还要对基础有一定的把握所以学习 JSP 时我们只做了解不用刨根问底花费大量的时间得不偿失。
我们主要从以下几个方面学习 JSP 技术
理解 JSP 及其原理学会使用 EL 表达式和 JSTL 标签理解 MVC 模式和三层架构重点
学习 JSP 到什么程度呢我们只需要能够使用 JSP 相关技术能够实现简单数据的增删改查即可。
JSP 概述
JSPJava Server Pages指的是 Java 服务端页面是一种动态的网页技术其中既可以定义 HTMLCSSJavaScript 静态内容也可以使用 Java 代码定义动态内容。通俗的说JSP HTML Java 。下面就是一个最简单的 JSP 代码
htmlheadtitletitle/title/headbodyh1HelloWorld/h1%System.out.println(HelloWorld!);%/body
/html上面的例子中html 里面的内容会在浏览器渲染而 Java 代码的输出语句会打印在 idea 控制台。
那么 JSP 到底是用来做什么的我们如何实现不同用户登录网页显示不同的信息呢例如在页面上显示登录的用户名 在 Servlet 中我们使用 write 对象向浏览器写数据html 标签可以作为字符串传入 write() 方法中。但是当向页面写出大量数据时代码显得十分的混乱不堪并且后期后期维护成本极大。而 JSP 就结局了这个问题在 JSP 代码中可以直接使用 html 标签动态数据也可以使用 Java 代码展示大大的简化了开发避免了在 Servlet 中直接输出 html 标签。
JSP快速入门
搭建环境
在 idea 中创建一个 Maven Web 项目项目结构如下 在 pom.xml 添加 Servlet 的依赖坐标和 TomCat 插件坐标如下
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.chengzi/groupIdartifactIdjsp-demo/artifactIdpackagingwar/packagingversion1.0-SNAPSHOT/versionnamejsp-demo Maven Webapp/nameurlhttp://maven.apache.org/urldependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/versionscopeprovided/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.tomcat.maven/groupIdartifactIdtomcat7-maven-plugin/artifactIdversion2.2/version/plugin/pluginsfinalNamejsp-demo/finalName/build
/project导入JSP依赖
在 pom.xml 中添加 JSP 的依赖坐标如下
dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.2/versionscopeprovided/scope
/dependency创建 JSP 页面
在项目的 webapps 文件目录下创建 jsp 页面如图 通过上面的操作创建一个名为 hello.jsp 的页面。
编写代码
在 hello.jsp 中书写 HTML 标签和 Java 代码如下
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1HelloWorld/h1
%System.out.println(helloWorld!);
%
/body
/html测试
启动 Tomcat 服务器在浏览器访问 http://localhost:8080/jsp-demo/hello.jsp结果如下 JSP原理
之前我们在 jsp 中不仅编写了 html 标签还编写了 Java 代码为什么呢其实JSP 本质上就是一个 Servlet。要弄明白这个问题我们就要研究 jsp 的执行流程。 在上面的例子中浏览器第一次访问 heelo.jsp 页面时Tomcat 会将 hello.jsp 装换为名为 hello_jsp.java 的一个Servlet 然后 这个 Servlet 会被 TomCat 编译为字节码文件 hello_jsp.class 。TomCat 会执行该字节码文件向外提供服务。
此时在项目磁盘目录下找到 target\tomcat\work\Tomcat\localhost\jsp-demo\org\apache\jsp 在这个文件目录下就可以看到装换后的 Servlet 和编译后的 .class 文件。如图 打开 hello_jsp.java 文件查看源码如图 可以发现转换后的 hello_jsp 类继承自 HttpJspBase 其实 HttpJspBase 类是继承自 HttpServlet 的我们可以查看 TomCat 源码所以 hello_jsp 类间接继承了 HttpServlet 也就是说JSP 容器将 JSP 文件装换成了一个 Servlet。
在 hello_jsp 类中还有一个 _jspService() 方法该方法和 Servlet 中的 service 方法类似在每次访问警示牌 jsp 时自动执行。如图 在 _jspService() 方法中可以看到完浏览器中写的标签和 Java 代码如下 不难看出在 %...% 中的 Java 代码被放到了 _jspService() 方法中这段 Java 代码被称为 JSP 脚本。
JSP 脚本
JSP 脚本用于在 JSP 页面内定义 Java 代码之前案例中使用到的 Java 代码就是定义在 JSP 脚本中的JSP 脚本一共分为 3 类 %…% 内容会直接放到 _jspService() 方法中 %…% 内容或被放到 out.print() 中作为该的方法的参数 %!..% 内容会被放到 _jspService() 方法之外被类直接包括
代码演示
第一步在 hello.jsp 中编写代码
%System.out.println(hello);int i 3;
%通过浏览器访问该资源查看转换后的 hello_jsp.java 源代码不难发现 i 变量被定义在 _jspService() 方法中如图 第二步在 hello.jsp 中编写代码
%hello%
%i%通过浏览器访问该资源查看转换后的 hello_jsp.java 源代码不难发现 i 变量成为了 out.print() 方法的参数并且这两个数据被发送到了浏览器展示给用户如图 第三步在 hello.jsp 中编写代码
%!void show(){}String name zhangsan;
%通过浏览器访问该资源查看转换后的 hello_jsp.java 源代码不难发现该部分被放到了类的成员部分如图 实战案例
使用 JSP 在浏览器以表格的形式展示学生信息的数据这里的数据应该使用 MyBatis 在数据库中查找但是这里只是简单的演示 JSP 的使用所以我们省略了对数据库的操作直接将数据封装到 Student 对象中并存放在集合中。
首先我们在 org.chengzi.pojo 包下创建一个实体类 Student 。在 Java 文件目录右击 new / Java class 创建包和类。如下
public class Student {private int id;private String name;private String gender;private int scoreEnglish;private int scoreMath;//省略了getter和setter方法以及重写的Object类的toString方法
}在项目 webapps 目录下创建 student.jsp在此文件中写 html 标签和 Java 代码我们可以先将数据写死方便展示在浏览器。如下
% page contentTypetext/html;charsetUTF-8 languagejava %
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
input typebutton value新增br
hr
table border1 cellspacing0 width800trth序号/thth姓名/thth性別/thth英语成绩/thth数学成绩/thth操作/th/trtr aligncentertd1/tdtd张三/tdtd男/tdtd100/tdtd100/tdtda href#修改/a a href#删除/a/td/trtr aligncentertd2/tdtd李四/tdtd男/tdtd100/tdtd100/tdtda href#修改/a a href#删除/a/td/trtr aligncentertd3/tdtd王五/tdtd女/tdtd100/tdtd100/tdtda href#修改/a a href#删除/a/td/tr
/table
/body
/html在浏览器访问该资源效果如下 准备需要动态展示到浏览器的数据这里省略了从数据库查询数据我们直接将数据封装在 Student 对象中并将所有对象放在集合中。例如
%// 查询数据库ListStudent brands new ArrayListStudent();brands.add(new Student(1,小张,女,85,89));brands.add(new Student(2,小樊,女,98,87));brands.add(new Student(3,小李,男,100,99));
%上面我们使用固定的数据发送到浏览器展示为了动态的展示数据我们要使用 Java 代码来动态的获取数据而在 JSP 页面中Java 代码要写在 JSP 脚本中如下
% page importorg.chengzi.pojo.Student %
% page importjava.util.ArrayList %
% page importjava.util.List %% page contentTypetext/html;charsetUTF-8 languagejava %
%// 查询数据库ListStudent students new ArrayListStudent();students.add(new Student(1, 小张, 男, 80, 85));students.add(new Student(2, 小李, 女, 98, 87));students.add(new Student(3, 小樊, 女, 98, 100));
%!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
input typebutton value新增br
hr
table border1 cellspacing0 width800trth序号/thth姓名/thth性別/thth英语成绩/thth数学成绩/thth操作/th/tr%for (int i 0; i students.size(); i) {//获取集合中的 每一个 Brand 对象Student student students.get(i);%tr aligncentertd%student.getId()%/tdtd%student.getName()%/tdtd%student.getGender()%/tdtd%student.getScoreEnglish()%/tdtd%student.getScoreMath()%/tdtda href#修改/a a href#删除/a/td/tr%}%/table
/body
/html此时数据就会被动态的展示到浏览器页面不难看出其实 JSP 脚本标签就是在分割 Java 代码在标签内是 Java 代码在标签外则是 html 语句如图 JSP缺点
不难看出JSP 开发还是有很多的缺点的首先既然在 jsp 文件中既可以写 html 标签有可以写 Java 代码导致了书写麻烦和阅读麻烦的问题。并且其运行要依赖各种环境例如 jrejsp 容器JavaEE 等等导致其程序变得十分复杂。
JSP 会自动生成 .java 文件和 .class 文件占用了磁盘空间而运行 .class 文件占用内存。在程序出错以后我们一般要找到自动生成的 .java 文件进行调试导致了调试困难的问题。
另外把 Java 代码和 html 代码混在一个文件中是非常不利于团队开发的如果页面出现问题首先前端开发工程师修改静态页面然后由后端开发来将该页面修改为 JSP 页面这不是我们想看到的合作开发方式。
由于 JSP 存在着很多的确定并且随着软件技术的发展JSP 已经逐渐退出历史的舞台了后面我们会学习新的技术 AJAX 来替代前面的方式有了这个技术以后前端工程师只负责前端页面的开发而后端工程师只负责后端代码的开发职责单一高效。
当然我们并不是说后端开发就不用学习前端的知识即使你是专注于后端开发前端的知识你同样要了解任何一个说后端不用了解前端知识的说法都是不负责任大额。
发展阶段
下面我们看一下服务器页面技术的发展过程聊聊为什么 JSP 既然已经被淘汰为什么我们还要学习呢 第一阶段
使用 Servlet 技术实现逻辑代码的编写也对页面进行拼接。
第二阶段
随着技术的发展出现了 JSPJSP 确实使用比 Servlet 方便了很多但是随着时间的发展JSP 的很多确定都暴露出来了。
第三阶段
使用 Servlet 进行逻辑开发使用 JSP 进行数据的展示。 第四阶段
使用 Servlet 进行后端逻辑代码的开发使用 HTML 进行数据的展示html 是静态页面为了展示动态数据出现了新的技术 AJAX。
现在我们学习 JSP 时大概有两个原因一是一些公司的老项目仍然使用了 JSP所以为了项目的维护我们不得不学习另外学习技术是一个循序渐进的过程我们必须一步一步的学习虽然 JSP 老旧过时但是其中的编程思想使我们学习编程过程中应该了解的。
前面说到使用 Servlet 进行逻辑开发使用 JSP 来获取数据遍历展现数据这样的方式解决了 JSP 页面中 Java 代码混乱的问题接下来看一看如何使用 EL 表达式和 JSTL 标签库来替代 JSP 页面中的 Java 代码。
EL 表达式
概述
EL Expression Language称为表达式语言用于简化 JSP 页面内的 Java 代码。EL 表达式的主要作用是获取数据期数就是从域对象中获取数据然后将数据展示在页面上。
EL 表达式的语法比较简单使用${expression}例如 ${student} 就是获取域对象中存储的 key 为 student 的数据。
实战案例
定义一个 Servlet在 Servlet 中封装数据并存储到 request 域对象中并转发到 el-demo.jsp 页面。
WebServlet(/demo)
public class ServletDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//准备数据ListStudent students new ArrayListStudent();students.add(new Student(1,张三,男,100,100));students.add(new Student(2,李四,女,98,98));//存储到request域对象中使用request转发将request作为域对象request.setAttribute(students,students);//发送到 el-demo.jsp 页面request.getRequestDispatcher(/el-demo.jsp).forward(request,response);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}在 el-demo.jsp 中通过 EL 表达式来获取数据EL 表示式后面不需要加分号。例如
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
html
headtitleTitle/title
/head
body${students}
/body
/html如果 JSP 中没有接收到 Servlet 共享的数据如图 解决方法在 JSP 代码中添加
isELIgnoredfalse添加位置在
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %域对象
上面我们在 Servlet 中使用转发将 request 作为域对象进行数据共享那么什么是域对象域对象有哪些呢
在 JavaWeb 中一共有四大域对象分别是
page当前页有效request当前请求有效session当前会话有效后面聊什么是会话application当前应用有效
如图所示 EL 表达式获取数据会一次从四个域中寻找知道找到为止。
例如例如 EL 表达式 ${students} 会先从 page 域对象中获取数据如果没有找到再去 request 域对象中获取数据一次寻找直到找到数据。
JSTL 标签
前端开发工程师每天都在和标签打交道他们对标签是更加敏感的所以出现了 JSTL 标准标签库使用标签替代了 JSP 页面中的 Java 代码提高了代码的可读性。如下
c:if test${flag 1}男
/c:if
c:if test${flag 2}女
/c:ifJSTLJsp Standarded Tag LibraryJSP 标准标签库其中提供了丰富的标签用于取代 JSP 页面中的 Java 代码例如
标签描述c:out用于在JSP中显示数据就像% … c:set用于保存数据c:remove用于删除数据c:catch用来处理产生错误的异常状况并且将错误信息储存起来c:if与我们在一般程序中用的if一样c:choose本身只当做c:when和c:otherwise的父标签c:whenc:choose的子标签用来判断条件是否成立c:otherwisec:choose的子标签接在c:when标签后当c:when标签判断为false时被执行c:import检索一个绝对或相对 URL然后将其内容暴露给页面c:forEach基础迭代标签接受多种集合类型c:forTokens根据指定的分隔符来分隔内容并迭代输出c:param用来给包含或重定向的页面传递参数c:redirect重定向至一个新的URL.c:url使用可选的查询参数来创造一个URL
使用 JSTL 之前要先导入依赖和引入标签库例如在 pom.xml 中添加依赖坐标
dependencygroupIdjstl/groupIdartifactIdjstl/artifactIdversion1.2/version
/dependency
dependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion1.1.2/version
/dependency在 JSP 页面中引入 JSTL 标签库
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % 下面举例练习几个常用的标签。
c:if标签相当于 Java 中的if判断语句示例定义一个 Servlet在 Servlet 中向 request 域对象中添加键为 status值为 1 的数据。 Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//存储数据到request域对象中request.setAttribute(status,1);//发送到 jstl.jsp页面request.getRequestDispatcher(/jstl.jsp).forward(request,response);}定义 jstl.jsp 页面使用 c:if 标签进行判断
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
html
headtitleTitle/title
/head
body
%--c:if来完成逻辑判断替换java if else--%
c:if test${status 1}启用
/c:ifc:if test${status 0}禁用
/c:if
/body
/htmlforEach标签相当于 Java 中的 for 循环Java 中有普通 for 循环和增强 for 循环其实在 JSTL 中的循环标签也有两种用法
用法1
第一种用法类似于 Java 中的普通 for 循环其中主要使用到的属性有
begin开始数end结束数step步长var循环变量
示例
c:forEach begin0 end10 step1 vari${i}
/c:forEach用法2
第二种用法类似于 Java 中的增强 for 循环主要使用的属性有
items被遍历的容器var遍历产生的零时变量varStatus遍历状态对象
示例
c:forEach items${students} varstudenttr aligncentertd${student.id}/tdtd${student.brandName}/tdtd${student.companyName}/tdtd${student.description}/td/tr
/c:forEach上面例子中首先从域对象中获取了 students 数据该数据是一个集合遍历结合并给集合中每一个对象起名为 student 在循环中使用了 EL 表达式获取每一个 Student 对象的属性值。 你问我青春还剩几年我的回答是趁现在正当时。身边朋友都在问我怎样学好一门编程语言怎样学好Java怎样通过 Java 找到一份满意的工作推荐学习此专栏Java编程基础教程系列零基础小白搬砖逆袭
下期见。