JSP与JSTL
jsp简介
jsp:全名java Server Page 是Sun公司提供的动态网页编程技术
它相比 html 而言,html 只能提供静态页面数据,而 JSP 则允许在页面中嵌入java代码,为用户提供动态数据。
相比 Servlet 而言,Servlet很难对数据进行排版,而jsp除了可以用java 代码产生动态数据的同时,也很容易对数据进行排版。
不管是jsp还是Servlet,虽然都能用于开发动态web资源。但由于这两门技术各自的特点,在长期的软件实践中,人们逐渐把 Servlet作为web应用中的控制组件来使用,而把jsp技术作为数据显示模板来使用。
其实 jsp 就是一个 Servlet,当我们第一次访问 jsp 的时候,jsp 引擎都会将这个 jsp 翻译成一个 servlet,这个文件存放在tomcat中的work目录中。
推荐使用前先在 idea 里配置一下编码格式,以防出现乱码情况:
JSP 使用和HTML一模一样,只是JSP可以编写内嵌的java代码!
注释
在JSP中支持两种注释的语法:一种是显示注释,这种注释是可以在客户端看到的(也就是可以在浏览器开发者工具中看见),另一种注释为隐式注释,客户端无法看见。
- 显示注释语法:从HTML风格继承而来
- 隐式注释语法:从JAVA风格继承;JSP自己的注释
// 单行注释
/*
多行注释
*/
以上两种只能在java程序段中编写
<!-- html风格的注释 -->
<%--
jsp的注释
--%>
Scriplet基础语法
在 jsp 中最重要的部分就是 Scriplet(脚本小程序),即所有嵌在HTML代码中的JAVA程序。
在JSP 中一共有三种 Scriplet 代码:都必须用 Scriplet 标记出来
第一种:<% %> :java 脚本段,可以定义局部变量,编写语句。
生成的代码在servlet中的service方法体中
第二种:<%! %> :声明。可以定义全局(成员)变量、方法、类 //一般用来定义全局变量
生成的代码在类中
第三种:<%= %> :输出表达式,数据,一个变量或具体内容
生成的代码在servlet中的service方法体中,相当于out.print();语句
jsp的指令标签
使用包含操作,可以将重复的代码包含进来继续使用,因为有些页面只需要一部分的页面进行变动,而不用变动的页面我们就可以使用包含操作进行页面的拼接。现有两种方法可以实现上述功能。
方法一:在每个jsp 页面(html)都包含工具栏、头部信息、尾部信息、具体内容 //也就是不使用包含
方法二:将工具栏、头部信息、尾部信息都分成独立的文件,使用的时候直接导入
显然,第二种方法更好,第一种方式种会出现很多冗余的重复代码,而且修改不方便,jsp 如果想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用 include 指令即可,动态包含则需要使用include 动作标签。
1.静态包含:静态包含就是将主体文件和所包含的文件通过 servlet 引擎转译的时候,直接将这几个文件的源代码整合到一起,全部放在jspService方法中,所以只生成了一个Servlet源码文件,所以这几个文件中不能有同名的变量。
小链接 :web项目中idea中jsp被编译后的class与java文件会生成在关联在idea中的tomcat路径下,此路径可以通过控制台查看tomcat启动信息得到,如:
下面继续说:
优点:运行效率稍高
缺点:耦合性高、不够灵活
格式如下:
<%--静态包含--%>
<%@include file="header.jsp"%>
<h2>主题内容</h2>
<%@include file="footer.jsp"%>
2.动态包含:
格式如下:
<%-- 动态包含--%>
<jsp:include page="header.jsp"></jsp:include>
<h2>主题内容</h2>
<jsp:include page="footer.jsp"></jsp:include>
注意:当动态包含不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格。
如果需要传递参数的话,可以使用动态包含传递参数方式:
<%-- 动态包含传递参数: value值支持表达式,而name值不支持表达式--%>
<jsp:include page="footer.jsp">
<jsp:param name="namem" value="admain"/>
<jsp:param name="msg" value="<%= str%>"/>
</jsp:include>
获取传递的参数:
使用request.getParameter(String name)
通过指定参数名来获取传递过来的参数
动态包含技术解析:这种包含技术采用的是相当于方法的调用方法来载入这些所包含的页面,会生成多个源码文件,因此几个页面之间互不干涉,所以变量名可以重复,如下:
JSP 的四大域对象
在jsp中提供了四种属性的保存范围,所谓的属性保存范围,就是指一个设置的域对象,可以在多少页面中保存并可以继续使用,说人话就是数据可以共享的范围。
- page范围
pageContext:只在当前页面中保存属性,跳转(jsp:forward)后就共享不了了 - request范围
只在一次请求中保存,服务器跳转后依然有效,客户端跳转无效
如果是客户端跳转,就相当于发出了两次请求,那么第一次的请求就不存在了,如果希望两种跳转都能拿到数据的话,就需要扩大范围了。 - session范围
在一次会话中有效,无论任何跳转又可以取得
因为当关闭浏览器,本次会话就结束了,所以如果想让属性设置一次后,不管是否是新的浏览器新的session都可以取到数据,那么就应该用application了。 - application范围
在整个服务器上保存
所有的用户(每一个session)都能取到数据,但是如果服务器重启了,那么保存在服务器上的数据就消失了。
使用域对象的准则:在合理范围内尽量使用范围最小的