1、JSP技术简介:
JSP技术比较简单,是建立在Servlet技术之上。全称Java Server Pages。
它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP/Servlet规范。JSP实际上就是Servlet。
JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,
而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
jsp就是把数据翻译html格式输出到客户端。如果你自己使用out输出,那么写html会非常复杂。
2、一个简单的jsp页面的编写:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
out.write(new Date().toLocaleString());
%>
</body>
</html>
基本的格式
<%
out.write(new Date().toLocaleString());
%>
当你在浏览器输入一个jsp网址时,jsp引擎会将jsp编译为java类,然后去执行service方法。
注意了:页面上不要写java代码,这个只是为了学习使用,正真的开发是不会把java代码写在jsp页面中的。
3、为什么可以在jsp页面中直接使用out.write();
因为jsp会被编译为java类,在那个类里面已经帮你定义好了这个对象。
你在D:\tomcat\apache-tomcat-7.0.77\work\Catalina\localhost\day10_01_session\..\index_jsp.java
的源文件中可以看到
4、Web服务器在调用jsp时,会给jsp提供一些什么java对象呢:
request
response
config
application
exception
Session
page
out
pageContext
5、JSP实践中使用:
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。
但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各得,servlet只负责响应请求产生数据,
并把数据通过转发技术带给jsp,数据的显示jsp来做。
6、JSP语法-JSP脚本表达式:
例如:
<body>
<%
request.setAttribute("name","你好") ;
%>
<!-- 上面叫做jsp脚本片段 -->
脚本表达式(输出一个变量):<%= request.getAttribute("name")%><br>
</body>
JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
注意了:JSP脚本表达式中的变量或表达式后面不能有分号(;)。
你访问这个jsp的时候,界面上就把 <%= request.getAttribute("name")%> 使用“你好”代替了。就实现了数据动态显示。
其实你去看编译后的源码发现,你的这个<%= request.getAttribute("name")%> 会被翻译为:
out.print(request.getAttribute("name"));
7、JSP语法-JSP脚本片段:
JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。
语法:
<%
多行java代码
%>
例如页面上想输出一个表格,可以这样嵌套书写(html代码不能写在<%%> 里面):
<table border = 1 width = 300>
<%
for (int i = 1;i<10; i++){
%>
<tr>
<td><%=i+"" %></td>
<td><%=tttt %></td>
</tr>
<%
}
%>
</table>
界面上就输出了一个10行2列的表格
8、JSP语法-JSP声明:
作用: 可以定义类变量和类方法,实例变量和实例方法。
没啥用处
JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。
语法:
<%!
java代码
%>
所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
例如:
<%!
int a = 0;
public void test(){
System.out.println("hello");
}
%>
调用方式:
<%
test();
%>
9、JSP语法-JSP注释:
<%-- --%>
HTML注释:<!-- --> ,页面源码能看到
Java注释: 页面源码看不到
Jsp注释: <%-- --%> 页面源码看不到
10、JSP语法-JSP指令(3个):
基本语法格式:
<%@ 指令 属性名="值" %>
a.page
例如jsp页面第一句就有个page
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
import可以写多个(只有这个import才能单独写),
例如你的工程中有个【com.example.test】包,想要引进来用可以这样写
<%@ page import="com.example.test.*" %>
b.include:
<%@ include file=”” %> : 静态包含 (将目标页面的源码拷贝一份) (推荐)
<jsp:include page= “” > : 动态包含 (执行目标页面,将结果包含)
例如:
<%@ include file=”2.jsp” %> 2.jsp是另外一个jsp页面(注意2.jsp里面的path 和 basePath删除,否则重复定义)。
<jsp:include page=”3.jsp” %>
静态包含在开发中使用更多。
c.taglib: 导入标签库时用。
11、JSP的9大隐式对象:
在jsp引擎把jsp页面翻译为servlet的时候,在创建service方法时就已经创建好了。
pageContext对象,代表的是一个页面的上下文对象。(可以通过它拿到其它的8个对象)
3大作用:
a.作为域对象,存储数据(本页面)
<body>
<%
pageContext.setAttribute("name", "你好") ;//存数据
%>
<%
String name = (String) pageContext.getAttribute("name") ;//取数据
out.write(name) ;
%>
</body>
存储其它域范围:
<body>
<%
pageContext.setAttribute("name1", "你好",PageContext.SESSION_SCOPE) ;//存到session
%>
</body>
在不关闭浏览器的情况下,访问其它jsp页面
<body>
<%
String name = (String) session.getAttribute("name1") ;//从session取数据
out.write(name1) ;
%>
</body>
PageContext.PAGE_SCOPE //本页面范围
PageContext.REQUEST_SCOPE //请求范围
PageContext.SESSION_SCOPE //会话范围
PageContext.APPLICATION_SCOPE //全局范围
b.提供了获取其他8大对象的方法:
request.setAttribute("name", "你好") ;
pageContext.getRequest().setAttribute("name", "你好") ;
以上两句没有任何区别
c.提供了请求转发和请求包含:
<body>
<%
request.setAttribute("name", "你好") ;
//请求转发
pageContext.forward("/2.jsp") ;
//请求包含
pageContext.include("/2.jsp") ;
%>
</body>
12、四大域对象:
PageContext:页面范围的数据。用的很少
ServletRequest:请求范围的数据。用的很多。显示一次数据后就没有用了,这样的数据应该放到该范围中
HttpSession:会话范围的数据。用的很多。每次请求和响应都需要共享的数据。比如登录信息,购物信息。
ServletContext:应用范围的数据。用的不多。所有客户端都共享的信息。注意同步。
13、JavaWeb开发模型:
a.JavaBean+JSP:只能开发很简单的应用,不适合企业级开发。
业务逻辑都是写在页面上的。
b.模型2:MVC:Model+View+Controller(模型+视图+控制器)
Model:JavaBean数据
View:JSP显示
Controller:Servlet控制器
所以我们现在一般都是用2,
三层架构:MVC指示三层架构的表现层
表现层一般都是和页面相关的