基础语法
脚本元素
-
脚本代码
<%...%>
<% int number=0; %>
在脚本代码中声明的变量是局部变量,只在当前页面有效
-
声明
<%!...%>
<%! int number=0; %>
在声明中定义的变量是全局变量,访问同一个jsp页面的用户,操作的是同一个全局变量
-
表达式
<%=...%>
表达式可以是任意合法的java表达式,该表达式的值会被计算,并将结果以字符串的形式返回到页面中。
注意:jsp表达式不是程序代码,末尾不加;
- 打印乘法表
<%@page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>expressionDemo</title>
</head>
<body>
<h1>九九乘法表</h1>
<table>
<%for (int i=1;i<=9;i++){%>
<tr>
<%for (int j=1;j<=i;j++){%>
<td><%=i%>*<%=j%>=<%=i*j%></td>
<%}%>
</tr>
<%}%>
</table>
</body>
</html>
- 打印乘法表
-
注释
<%--...--%>
在jsp转译为java类时被忽略- 在jsp脚本代码中也可以使用java的注释方法,这些注释在编译时被忽略
- 也可以使用HTML的注释语法
<!--...-->
,注释内容可以在浏览源代码中查看指令元素
在jsp文件转译时处理,用于实现类的引入、定义jsp页面的编码格式、包含其他文件、引入新的标签库等
<%@指令名 属性="值">
jsp页面默认引入的几个包:java.lang、.....
-
page指令
定义全局属性,可出现多次,但只有import属性可以在同一个jsp文件中出现多次
属性- language:定义脚本代码使用的语言,默认java
- import:定义jsp页面导入的类包
- errorPage:当请求错误时,会被重定向的URL
- isErrorPage:值为true时,表当前页面是一个错误处理页面
- contentType:定义页面响应信息的MIME类型和编码方式
<%@page contentType="text/html;charset=UTF-8"%>
- pageEncoding:定义页面响应信息的编码方式
-
include指令
在当前页面中的指定位置插入另一个文件的内容,属于静态包含(先包含再转译),只编译一次
<%@include file="url"%>
url是一个相对路径 -
taglib指令
标记元素
实现动态文件包含、页面跳转、使用javaBean组件等
<jsp:标记名 属性="值">
</jsp:标记名>
-
<jsp:include>
标记
先分别转译、编译、运行,再将结果合并
格式:
<jsp:include page="path">
<jsp:param name="Name1" value="Value1" />
<jsp:param name="Name2" value="Value2" />
</jsp:include>
-
<jsp:forward>
标记
实现页面请求的转发,(转发后,URL显示不变)
格式:
<jsp:forward page="path">
<jsp:param name="name1" value="value1" />
param用来在转发的同时传递参数
</jsp:forward>
-
比较:
<jsp:forward>
和response.sendRedirect("")
-
<jsp:forward>
请求转发,URL不变,保留第一次请求时的数据 -
response.sendRedirect("")
重定向,URL改变,不保留第一次请求时的数据
-
-
-
<jsp:param>
标记
用于配合<jsp:forward>
标记和<jsp:include>
标记
格式:
<jsp:param name="name" value="value"/>
- 在相应页面使用
request.getParameter()
来接收页面中<jsp:forward>
标记和<jsp:include>
标记传递的参数
jsp内置对象
- request
- response
- pageContext
- session
- application
- out:用于向客户端输出信息
- config:封装了jsp页面对应servlet的配置信息
- page:jsp页面类实例
- exception:封装了异常信息
数据库的访问
建立目录结构
在tomcat的webapp下建立
JDBC
-
定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
-
JDBC核心组件
- DriverManager:
此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。 - Driver:
此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。 - Connection:
该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。 - Statement:
使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。 - ResultSet:
在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。
- DriverManager:
-
SQLException:
此类处理数据库应用程序中发生的任何错误
数据库连接步骤
- 导入jdbc的api:先导入java.sql包
<%@page import="java.sql.*" %>
- 加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
-
创建数据库的连接
-
使用DriverManager的getConnection(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
//连接MySql数据库,用户名和密码都是rootString sConnStr="jdbc:mysql://localhost:3306/newsdb";
String username = "root" ;
String password = "root" ;
Connection conn = DriverManager.getConnection(sConnStr , username , password ) ;
-
创建Statement对象
- 要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
执行静态SQL语句。通常通过Statement实例实现。
执行动态SQL语句。通常通过PreparedStatement实例实现。
执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:
Statement stmt = conn.createStatement() ;
- 要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
-
执行SQL语句
-
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute
-
ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。
如:
查询:
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
-
int executeUpdate(String sqlString):用于执行INSERT、UPDATE、DELETE语句以及SQL DDL语句,如CREATE TABLE和DROP TABLE等
如:
删除:
String sql = "delete from user where id="+id
插入:
String sql = "INSERT INTO user(username,password,gender,resume) "+" values('"+uname+"','"+pwd+"','"+gender+"','"+resume+"')";
int result = stmt.executeUpdate(sql)
- execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
-
-
-
遍历结果集
两种情况:-
执行更新返回的是本次操作影响到的记录数。
-
执行查询返回的结果是一个ResultSet对象。
- ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
- ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
-
使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始) -
处理异常,关闭JDBC对象资源
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:- 先关闭requestSet
- 再关闭preparedStatement
- 最后关闭连接对象connection
- conn.close();
-
- 在相应页面使用
HTTP会话机制
Cookie
- 服务器端向客户端增加Cookie:response.addCookie()
- Cookie用javax.servlet.http.Cookie类表示
- 相关语句:
- 获取cookie名称:getName()
- 获取cookie值:getValue()
- 设置最大有效期:setMaxAge(),单位是秒
- 除了自己设定的Cookie内容外,Cookie中还会有JSESSIONID值,这是服务器自动创建的Cookie
session
- 客户端第一次请求服务器时,服务器产生一个session对象(用于保存该用户的信息),并且每个session对象,都会有唯一的sessionId(用于区分其他session),服务端会产生一个Cookie,并且该Cookie的JSESSIONID的值为sessionId的值,然后服务器会在响应的同时,将该Cookie发送给客户端,至此,客户端就有了一个Cookie(JSESSIONID)。因此,客户端的cookkie就可以和服务器端的session一一对应。
- 相关语句
- 获取session对象的属性值getAttribute()
- 设置session对象的属性以及属性值setAttribute(name,value)
- 获取session对象的创建时间getCreationTime(),返回1970年1月1日至今的毫秒数
- 销毁session对象的信息,但session对象本身不被销毁invalidate()
- 设置会话超时时间setMaxInactiveInterval()
常见报错解决
- 报错:java.sql.SQLException: The server time zone value ‘XXXXXX’ is unrecognized or represents more than one time zone.
- 使用的数据库是MySQL,驱动是6.0.3,这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,如果需要使用gmt+8时区,需要写成GMT%2B8,否则会被解析为空。再一个解决办法就是使用低版本的MySQL jdbc驱动,5.1.28不会存在时区的问题。
- 乱码问题,将编码设置统一即可
jsp常用语句
jsp页面的流程控制
- 超链接
<a href="..."></a>
- form表单的action属性
- 重定向
sendRedirect("...")
- 请求转发
<jsp:forward page="...">
jsp页面的数据传递
- form表单:对应使用
request.getParameter()
获取表单数据 - URL传参:如:
http://123.com/name?id=1&pwd=1
<jsp:param>
标记传参:对应使用``
作用域
- application:有效范围从web应用启动到结束
- session:有效范围是当前会话
- request:有效范围是当前请求,从发出请求到服务器处理完成请求,返回响应
- page:有效范围是当前页面
javabean技术
概述
jsp中使用javabean来传递参数和实现数据处理。javabean就是一个符合特定条件的java类,编写javabean就是创建一个java类。
分类
- 封装数据
- 封装业务逻辑
编写
-
类公有化
- 具有无参数的公共构造方法
-
属性私有化
-
具有公共的setter方法和getter方法来供外部存取其私有属性
注:setter方法和getter方法的命名规则是相应属性名的第一个字母大写后,与setter或getter连写,如:username的getter方法应该是getUsername。另外javabean要放在命名包里,不能放在默认包中
如:
package bean; public class Counter{ private int counter=0; public String getCounter(){ counter++; return ""+counter; } }
-
使用javabean
-
<jsp:useBean>
可以在 JSP 中声明一个 JavaBean,然后使用。声明后,JavaBean 对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问<jsp:useBean id="id" class="package.class" scope="page|request|session|application"/>
- 功能:在指定scope范围内查找该javabean对象,如果存在则返回给id变量,否则实例化该对象,并将引用赋值给id变量
- 说明:id属性表示创建的对象的名字,class属性指定javabean的完整类名,scope属性指定所创建的对象的作用范围,默认值是page
-
<jsp:setProperty>
为javabean的一个或多个属性赋值,实际是调用javabean对象的setter方法来实现赋值,使用时,要先用<jsp:useBean>
获得一个对象-
自动匹配赋值
<jsp:setProperty name="beanName" property="*" />
name指出javabean对象的名字,其值与usebean标签的id对应,property指出javabean对象的属性名,
*
表示匹配所有属性 -
自动匹配指定属性
<jsp:setProperty name="beanName" property="beanPropertyName" />
-
手动设置属性:
<jsp:setProperty name="beanName" property="beanPropertyName" value="value"/>
-
手动指定request参数名赋值:
<jsp:setProperty name="beanName" property="beanPropertyName" param="requestParamName"/>
param指定用哪个request对象的参数作为javabean属性的值,适用于javabean属性名和request参数名不同的情况
-
-
<jsp:getProperty>
用于从某个scope范围内获取指定属性的值,并显示在jsp页面中<jsp:getProperty name="beanName" property="beanPropertyName"/>
-