区分一下html、servlet、jsp的区别:
html页面:
静态页面,写标签显示数据方便,但是不能再页面中使用java代码,使用变量
Servlet:
可以在java代码中处理用户请求时通过response对象给用户响应一个页面
可以在页面中显示变量,但是写页面过于繁琐
jsp: 本质是一个Servlet,服务器创建了jsp语法规则,按照jsp语法写的页面 服务器可以翻译为Servlet文件,然后将页面中的内容按照格式写入到响应报文中交给浏览器显示
java server page, 只能在服务器中运行
HTML+Servlet强强联合,以页面的形式开发,又可以在页面中使用java代码变量又可以快速的书写html标签
jsp的本质以及运行原理:
jsp的本质和运行原理: 本质是Servlet,是对Servlet的扩展
服务器接受到用户的jsp请求时,服务器首先按照jsp语法将jsp页面翻译为Servlet.java文件
-存放在:tmp0\work\Catalina\localhost\07_web_jsp\org\apache\jsp
- 间接实现了Servlet接口: 翻译后的java类 extends HttpJspBase extends javax.servlet.http.HttpServlet
- 需要在web.xml中配置:jsp页面在被访问时由服务器管理翻译编译执行
在tomcat的web.xml配置文件中发现
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
再将Servlet文件编译为class文件
再调用class文件的生命周期方法处理用户请求[构造器、init、service]
学习jsp就是学习服务器的jsp引擎如何将jsp页面翻译为Servlet文件:
1、模板元素:
html内容: 页面中的纯文本、标签、html注释..
作用:显示页面
翻译:将html内容直接翻译到service方法中作为out.write()的字符串参数写入到响应体中,最终被浏览器显示
例子:
直接书写,想让页面显示的内容直接通过标签书写
out.write("<h1>hehe</h1>");的字符串参数写入到响应体中
2、jsp脚本片段:
java代码
作用:控制页面中逻辑
翻译:直接按顺序拷贝到service方法中,service方法内可以写啥jsp脚本片段就可以写啥
例子:
<%="a" %>
3、jsp表达式:
java变量
作用:向响应体中写入变量的值
翻译: 按顺序翻译到service方法中作为out.print()的参数将变量的值写入到响应体显示到页面中
例子:
jsp表达式
作为out.print()的参数写入到响应体,print方法可以要什么参数,就可以写啥
例子(遍历集合中的数据,将数据输入到表格中,主要是脚本片段的使用<% %>)
<body> <!-- 模拟创建数据 --> <% List<User> list = new ArrayList<User>(); list.add(new User(1, "hehe1" , "123456" , "hh@atguigu.com")); list.add(new User(2, "hehe2" , "223456" , "hh@atguigu.com")); list.add(new User(3, "hehe3" , "323456" , "hh@atguigu.com")); list.add(new User(4, "hehe4" , "423456" , "hh@atguigu.com")); list.add(new User(5, "hehe5" , "523456" , "hh@atguigu.com")); %> <!-- 通过jsp脚本片段遍历集合,通过jsp表达式将遍历的变量值显示到页面中 , 通过html模板元素显示表格 --> <!-- 表格的一行可以显示一个user的数据,一列可以显示user的一个属性,表格的行数由集合的长度决定 --> <table border="1" width="70%" align="center"> <tr> <th>id</th> <th>账号</th> <th>密码</th> <th>邮箱</th> </tr> <% for(User user: list){ //每次遍历得到一个user对象,可以创建一个tr显示 %> <!-- 创建tr --> <tr> <td><%=user.getId() %></td> <td><%=user.getUsername() %></td> <td><%=user.getPassword() %></td> <td><%=user.getEmail() %></td> </tr> <% } %> </table> </body>
|
jsp中注释:(主要是在jsp页面中,注释jsp代码要用<%-- --%>,用java注释和html注释不管用)
jsp页面中的注释: 1、html注释: 会被jsp引擎翻译到java代码中,作为out.write()的字符串参数写入到响应体中 但是浏览器html引擎解析响应体时会忽略html注释 注释页面中的html内容 2、java注释: 一般是在jsp脚本片段中使用,相当于在service方法中写注释,会被jsp引擎拷贝到service方法中 但是jvm将java类编译为class文件时会忽略java注释 注释脚本片段中java代码中的内容 3、jsp注释:jsp相关内容不能使用java注释和html注释,必须使用jsp注释 语法:<%-- --%> jsp引擎在将jsp页面翻译为servlet时会忽略jsp注释 |
jsp中指令和动作:
page指令:
属性
language: jsp页面支持的语言
contentType: 设置响应报文的响应头[解决响应乱码]
pageEncoding: jsp引擎将当前jsp页面翻译为servlet时使用的编码
import: 导包
buffer: out输出流的缓冲区大小
errorPage: 当前页面发生错误跳转的错误页面
isErrorPage: 设置当前jsp页面为错误页面 默认false不是
isELIgnored: 是否忽略EL表达式 默认false不忽略
session: 设置是否支持在浏览器的一次访问过程中共享数据 默认true支持
jsp指令:对jsp页面的相关配置
jsp的语法解析的优先级比标签高
jsp所有的内容都是由服务器的jsp引擎解析执行,路径也是由服务器先解析,绝对路径的基准地址:http://localhost:8080/项目名
基本语法:<%@ 指令名 属性="属性值" %>
4.1 page指令 知道
<%@ page 属性="属性值" %>
4.2 include指令: 静态包含指令,jsp03.jsp可以将另外一个页面静态包含到当前页面中
<%@ include 属性="属性值" %>
<%-- <%@ include file="/helloworld.jsp" %> --%>
file属性:要引入的页面地址
引入的过程:
当前页面中如果有静态指令,先将静态指令要引入的页面代码原封不动拷贝到当前页面中
再对当前页面进行翻译、编译、再执行
特点: 只会翻译编译执行一个文件,效率高
4.3 taglib指令 : 用来引入jstl标签库的
<%@ taglib 属性="属性值" %>
5、jsp的动作标签: 模拟html标签的形式使用java代码
每个动作标签本质就是一套java代码
转发标签: 转发到其他页面
<jsp:forward></jsp:forward>
jsp就是动作标签的前缀名
page属性:要转发的页面地址
动态包含标签:动态的将目标页面包含到当前页面中[不用、和inclue指令进行比较]
<jsp:include page=""></jsp:include>
jsp引擎先将当前页面和目标页面都翻译为java类,再编译为class文件,运行当前页面的servlet时,执行到动态包含的代码时,再通过java代码执行目标页面的servlet
特点:两个页面都会被翻译编译、执行,通过java代码关联起来的[效率低]
例子:<jsp:forward page="/helloworld.jsp"></jsp:forward>