JSP基础

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相关联的属性:

指令描述
pagepage属性包含的是一个相对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层依赖业务层!
在这里插入图片描述


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值