文章目录
JSP介绍
怎样学习JSP? - bravo1988的回答 - 知乎
https://www.zhihu.com/question/23984162/answer/689106407
脚本程序
JSP脚本就是Java代码片段,它分为三种:
- <%…%>:Java语句;
- <%=…%>:Java表达式;
- <%!..%>:Java定义类成员;
脚本程序可以包含任意量的Java语句、变量、方法或表达式
,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
示例
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
JSP声明
一个声明语句可以声明一个或多个变量、方法
,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
JSP声明的语法格式:
<%! declaration; [ declaration; ]+ ... %>
示例
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
不能使用分号结束
JSP表达式的语法格式:
<%= 表达式 %>
示例
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
JSP 指令
JSP指令用来设置与整个JSP页面相关的属性。
JSP中的三种指令标签
<%@ page ... %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
Page指令的语法格式:(添加在头部)
<%@ page language="java" import="import java.util.*" contentType="text/html;charset=utf-8" %>
下表列出与Page指令相关的属性:(主要用前两个)
属性 | 描述 |
---|---|
import | 导入要使用的Java类 |
pageEncoding | 页面编码(Tomcat把jsp编译成.java文件时需要) |
contentType | 响应头,等同于 response.setContentType(“text/html;charset=utf-8”) |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面**(转发)** |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 这个页面可以使用exception对象,其它页面不行! |
import属性示例
运行之后未发生错误
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.LinkedList" %>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
ArrayList arr = new ArrayList();
arr.add(1);
LinkedList l = new LinkedList();
l.add(1);
%>
</body>
</html>
Include指令的语法格式如下:
即静态包含,与RequestDispatcher的include()方法相似.
<%@ include file="文件相对 url 地址" %>
示例
先创建一个include.jsp
文件,然后新建header.html
, footer.html
文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="header.html" %>
<br>
<%@ include file="footer.html" %>
</body>
</html>
将header.html
, footer.html
文件内文件都删除,然后分别输入如下代码
<div>
this is header.
</div>
<div>
this is footer.
</div>
结果这两句将在浏览器正常输出.
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
JSP注释
三种注释方法:
注释 | 说明 |
---|---|
<–html注释–> | 客户端通过源代码可见 |
<%–JSP的注释–%> | 不可见 |
//单行注释,/*多行注释*/ | 不可见 |
JSP语法
脚本程序的语法格式:
<% 代码片段 %>
例如
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
JSP声明(变量或者方法)
变量或者语法
在<%! %>中声明的变量,是全局变量
在<% %>中声明的变量,是局部变量
示例:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
<%! int add(int a,int b){
return x + y;
}
%>
JSP表达式(输出)
JSP表达式的语法格式:
<%= 表达式 %>
示例
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%> <br/>
x + y <%= add(1,2) %>
</p>
JSP 生命周期
JSP编译,初始化,执行,销毁.
九大内置对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
5个常用对象: out(输出)、 request(请求) 、response(响应)、 session(会话) 、application(应用)
4个不常用: page、 pageContext、 exception、 config
Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象;(域对象都有setAttribute()和getAttribute()) 有点乱…
ServletContext : 整个应用程序
session : 整个会话
request : 一个请求链
pageContext : 一个JSP页面,这个域是在当前JSP页面和当前JSP页面中使用的标签之间共享数据!
- 域对象
- 代理其它域
- 全域查找 : pageContext.findAttribute(“xxx”) : 从小到达,依赖查找!
- 获取其他对象,所以它有一些方法(getRequest(),getSession()等等)
request对象
是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
请求方法名: <%= request.getMethod() %>
请求的资源: <%= request.getRequestURI()%>
请求使用的协议: <%= request.getProtocol()%>
请求的服务器IP: <%= request.getServerName() %>
客户端的IP地址: <%= request.getRemoteAddr() %>
客户端的主机名: <%= request.getRemoteHost() %>
表单提交来的值: <%= request.getParameter(“userName”)%>
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等
。
设置cookie实例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie myCookie = new Cookie("darkmi","jikexueyuan");
myCookie.setMaxAge(3600);
response.addCookie(myCookie);
%>
</body>
</html>
session对象
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
session的唯一标识符: <%= session.getId()%></br>
session的创建时间: <%= session.getCreationTime()%></br>
session的最后访问时间: <%= session.getLastAccessedTime() %></br>
session的失效时间: <%= session.getMaxInactiveInterval() %></br>
</body>
</html>
修改session时间,修改web.xml文件,如果没有,则右键项目名称->Java EE Tools->Generate XXX
加入如下代码
<session-config>
<session-timeout>10</session-timeout>
</session-config>
发现没有变化
此时清除tomcat缓存
之后,可以看到session timeout发生变化
GET/POST提交方式的区别
具体参考w3school
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
测试代码
index.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
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>
<h1>用户登录</h1>
<form action="dologin.jsp" name="loginForm" method = "post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>
密码:
</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="login"></td>
</tr>
</table>
</form>
</body>
</html>
登录后跳转的页面dologin.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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 'dologin.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>
登录成功 <br>
</body>
</html>
JSP动作标签
使用示例
这些jsp动作标签与html提供的标签有本质的区别,动作标签是由tomcat来解释执行,它与Java代码一样,都是在服务器端执行的!
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
* jsp:setProperty | 设置JavaBean的属性。 |
* jsp:getProperty | 输出某个JavaBean的属性。 |
1 . <jsp:forward>
即转发,它与RequestDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用 , jsp:forward动作把请求转到另外的页面。jsp:forward标记只有一个属性page。语法格式如下所示:
<jsp:forward page="相对 URL 地址" />
以下是forward相关联的属性:
指令 | 描述 |
---|---|
page | page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个 Java Servlet. |
<jsp:forward>
示例
创建main.jsp , date.jsp两个文件
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="Date.jsp"></jsp:forward>
</body>
</html>
date.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
2 . <jsp:include>
即包含,它与RequestDispatcher的include方法是一样的,一个是在servlet中使用,一个是在jsp中使用!
一个页面包含另一个页面,并向另一个页面传参
<jsp:param name="name" value="Tom" />
为要传递的变量
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Include动作指令示例</h2>
<jsp:include page="Date.jsp" flush="true" >
<jsp:param name="name" value="Tom" />
<jsp:param name="password" value="123"/>
</jsp:include>
</body>
</html>
然后新建一个文件,用于接收第一个页面传递过来的参数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>
<% String name = request.getParameter("name");
out.print("name:" + name +"\n");
%>
<%
out.print("password:" + request.getParameter("password"));
%>
</p>
</body>
</html>
动作指令useBean
JavaBean
3 . <jsp:useBean>
先来看下什么是JavaBean是一种规范,也就是对类的要求。它要求Java类的成员变量提供getter/setter方法,这样的成员变量被称之为JavaBean属性。
JavaBean还要求类必须提供仅有的无参构造器,例如:public User() {…}
菜鸟教程 JavaBean
https://www.runoob.com/jsp/jsp-javabean.html
提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!使用beanutils需要的jar包:
以后主要用这个包
- commons-beanutils.jar;
- commons-logging.jar;
EL概述
JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%> , 目的就是替代这种写法。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
2.1 EL表达式格式
先来了解一下EL表达式的格式!现在还不能演示它,因为需要学习了EL11个内置对象后才方便显示它。
- 操作List和数组: l i s t [ 0 ] 、 {list[0]}、 list[0]、{arr[0]};
- 操作bean的属性: p e r s o n . n a m e 、 {person.name}、 person.name、{person[‘name’]},对应person.getName()方法;
- 操作Map的值: m a p . k e y 、 {map.key}、 map.key、{map[‘key’]},对应map.get(key)。
2.2 EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。
pageScope
requestScope
sessionScope
applicationScope
param;
paramValues;
header;
headerValues;
initParam;
cookie;
pageContext;
MVC 与 三层框架
MVC
JSP Model2模式已经可以清晰的看到MVC完整的结构了。
- JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
- Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
- JavaBean:模型层,完成具体的业务工作,例如:开启、转账等。
三层框架
我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的!
所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access Object)。
- WEB层:包含JSP和Servlet等与WEB相关的内容;
- 业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;
- 数据层:封装了对数据库的访问细节;
注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!