tips:本文基于ppt整理而成,非原创,有任何问题欢迎私信交流
相关习题可查看文章:JSP期末考试复习习题及答案
预祝各位小伙伴们考试顺利 !
附相关原创文章:
JSP基础教程
HTML
JDBC
JDBC自定义工具类
JDBC连接池
servlet工作原理和生命周期
servlet请求与响应
基于 JSP、EL表达式实现登录,并使用过滤器与监听器
文章目录
一、 JSP语法基础
1.1 JSP文件结构
JSP原始代码中包含了JSP元素和Template(模板) data两类
-
Template data:JSP引擎不处理的部分,即标记<%…%>以外的部分
例如代码中的HTML的内容等 ,这些数据会直接传送到客户端的浏览器 -
JSP元素:由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误
1.2 JSP运行原理
1.3 JSP语法基础
脚本语法
-
HTML注释:<!— comments -->
发送到客户端不显示,但是可以在查看源码中看到 -
JSP隐藏注释:<%-- comments --%>
不发送到客户端,即不显示,只在编译器中看得到 -
JSP声明:<%! declaration; [ declaration; ] … %>
1) 声明在网页初始化时候生效,在本网页内有效
2) 声明是全局变量
tips:声明可以是变量,也可以是方法
例:
- JSP表达式:<%= expression %>
例:
- JSP脚本段:<% 代码 %>
例:
编译器指令
包含include指令
向当前页中插入一个静态文件的内容
- JSP 语法格式:
<%@ include file=“relativeURL” %>
<%@ include file=“相对位置” %>
例:
页面page指令
用于定义JSP文件中的全局属性
- 语法格式:
JSP 语法格式如下:
<%@ page
[ language=“java” ] [ extends=“package.class” ]
[import="{package.class | package.*},…" ]
[ session=“true | false” ] [ buffer=“none | 8kb | sizekb” ]
[ autoFlush=“true | false” ]
[ isThreadSafe=“true | false” ] [ info=“text” ]
[ errorPage=“relativeURL” ]
[ contentType=“mimeType [;charset=characterSet]” |
“text/html; charset=ISO-8859-1” ]
[ isErrorPage=“true | false” ]
%>
例:
标签库taglib指令
用于指定页面中使用标签库和自定义标签库的前缀
详见JSTL
动作语法
forward
由程序控制从当前文件跳转到另外一个文件
- 语法格式
1.<jsp:forward page={"relativeURL" | "<%= expression %>"} />
2.<jsp:forward page={"relativeURL" | "<%= expression %>"} >
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />
</jsp:forward>
page="{relativeURL | <%= expression %>}"
这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL。这个文件可以是JSP、程序段或者其它能够处理request对象的文件(如asp,cgi,php)。
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />
向一个动态文件发送一个或多个参数,这个文件必须是动态文件。如果想传递多个参数,可以在一个JSP文件中使用多个“<jsp:param>”;“name”指定参数名,“value”指定参数值。
<jsp:forward>从一个JSP文件向另一个文件传递一个包含用户请求的request对象“<jsp:forward>”标签以后的代码,将不能执行。
例:
include
用于包含一个静态或动态文件
- 语法
1.<jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
2.<jsp:include page="{relativeURL | <%=expression %>}" flush="true" >
<jsp:param name="parameterName" rameterValue | <%= expression %>}"/>
[<jsp:param …/>]
</jsp:include>
page="{relativeURL | <%=expression %>}"
参数为一相对路径,或者是代表相对路径的表达式。
<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" />
“<jsp:param>”用来传递一个或多个参数到指定的动态文件,能在一个页面中使用多个“<jsp:param>”来传递多个参数。
例:
usebean
javabean内容
二、 JSP内置对象
可以不用声明和创建,直接在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量
内置对象必须由支持JSP的容器去创建
- 九大内置对象:
request请求对象 (重点)
response响应对象(重点)
session会话对象(重点)
out输出对象(重点)
page页面对象
application应用程序对象
pageContext面上下文对象
config配置对象
exception异常对象
2.1 内置对象–request
客户端的请求信息被封装在request对象中
通过request才能了解客户的需求,然后做出响应
常见方法:
方法 | 描述 |
---|---|
getParmeter(String name) | 获取表单提交的信息,以字符串形式返回某个请求参数的值;当没有参数与之对应,返回null |
getParameterNames() | 获得客户端传送给服务器端的所有参数,其结果是一个Enumeration(枚举)实例 |
getCharacterEncoding() | 返回客户端请求中的编码方式 |
getContentLength() | 以字节为单位返回客户端请求的大小 |
getHeader(String name) | 用户获取HTTP协议文件头信息中指定名字的值 |
getHeaderNames() | 返回HTTP协议所有文件头信息,其结果是一个Enumeration(枚举)实例 |
getMethod() | 返回客户端请求的方法(get or post) |
getProtocal() | 获取客户端向服务器端传送使用的协议 |
getRequestURL() | 用户获取客户端URL地址 |
getRemoteAddr() | 获取客户端IP地址 |
getRemoteHost() | 获取客户端主机名字 |
getServerName() | 获取服务器端主机的名字 |
getServerPort() | 获取服务器端口号 |
removeAttribute(String name) | 删除请求的一个属性 |
setAttribute(String name,Object object) | 为request对象设置属性 |
getAttribute(String name) | 获取request对象属性为name的值 |
getAttributeNames() | 返回request对象所有属性值,结果是一个Enumeration(枚举)实例 |
2.2 内置对象–response
用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应
常见方法:
方法 | 描述 |
---|---|
addCookie(Cookie cook) | 用户给用户添加一个Cookie,保存客户端相关信息 |
addHeader(String name, String value) | 添加带有指定名字和字符串的HTTP文件头信息 |
getCharacterEncoding() | 返回响应的字符串编码方式 |
sendError() | 向客户端发送错误信息 |
sendRedirect() | 重新定向客户端请求 |
setCharacterEncoding() | 设置响应的字符串编码方式 |
forward 和 redirect
forward:转发
redirect:重定向
例:
2.3 内置对象–session
JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化
常见方法:
类型 | 方法 | 描述 |
---|---|---|
public Object | getAttribute(String name) | 返回session对象中与指定名称绑定的对象,如果不存在则返回null |
public Enumeration | getAttributeNames() | 返回session对象中所有的对象名称,其结果是一个Enumeration(枚举)实例 |
public long | getCreationTime() | 返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起 |
public String | getId() | 返回session对象的ID |
public long | getLastAccessedTime() | 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 |
public int | getMaxInactiveInterval() | 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开 |
public void | invalidate() | 将session无效化 |
public void | removeAttribute(String name) | 移除session中指定名称的对象 |
public void | setAttribute(String name, Object value) | 使用指定的名称和值来产生一个对象并绑定到session中 |
public void | setMaxInactiveInterval(int interval) | 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效; |
2.4 内置对象–out
在浏览器客户端输出内容(页面缓冲区输入,当缓冲区满或者页面执行结束时,将缓冲区的内容输出)
常见方法:
类型 | 方法 | 描述 |
---|---|---|
void | println() | 向客户端打印字符串 |
void | flush() | 将缓冲区内容输出到客户端 |
void | clear() | 清除缓冲区,在flush()方法之后调用会异常 |
void | clearBuffer() | 清除缓冲区,在flush()之后调用不会异常 |
int | getBufferSize() | 返回缓冲区字节数大小 |
JspWriter(out) 和 PrintWriter(response.Writer)区别
-
1)所有页面输出最后都是out输出(JSPWriter);
response.Writer输出是PriterWriter输出; -
2)out输出是先往页面缓冲区中写,缓冲区满或者页面执行结束,
然后再输出;
response.Writer是直接输出。
2.5 内置对象–application
实现用户之间数据的共享,为全局变量
Tomcat服务器的启动和关闭决定了application的生命周期
常见方法:
类型 | 方法 | 描述 |
---|---|---|
public Object | getAttribute(String name) | 返回applicaltion对象中与指定名称绑定的对象,如果不存在则返回null |
public Enumeration | getAttributeNames() | 返回applicaltion对象中所有的对象名称,其结果是一个Enumeration(枚举)实例 |
public void | setAttribute(String name ,Object value) | 设置application属性及其值 |
public void | removeAttribute(String name) | 删除applicaltion对象中属性及其对应的值 |
public String | getServerInfo() | 返回Servet编译器版本信息 |
2.6 内置对象–pageContext
实现获得当前JSP页面所有对象和命名空间的访问
常见方法:
方法 | 描述 |
---|---|
getRequest() | 返回当前的request对象 |
getResponese() | 返回当前的response对象 |
getSession() | 返回当前的session对象 |
getOut() | 返回当前的out对象 |
2.7 内置对象–page、config、exception
-
page对象
指向当前JSP页面本身(有点像类中的this指针),它是java.lang.Object类的实例 -
config对象
代表当前JSP 配置信息
但JSP 页面通常无须配置,因此也就不存在配置信息 -
exception对象
Throwable实例,代表JSP脚本中产生的错误和异常,是JSP页面机制的一部分(见编译器语法介绍)
2.8 内置对象生命周期
三、 JavaBean
JavaBean是特殊的Java类,使用Java语言书写,并且遵守JavaBean API规范
- Javabean和普通Java类特殊性:
1)提供一个默认的无参构造函数
2)可能有一系列私有可读写属性
3)可能有一系列的"get"或"set"方法
3.1 JSP中使用JavaBean
useBean
创建一个Bean实例并指定它的名字和作用范围
语法格式:
<jsp:useBean id="beanInstanceName"
scope="page | request | session | application"
{
class="package.class" | type="package.class" |
class="package.class" type="package.class" |
beanName="{package.class | <%= expression %>}"
type="package.class"
}
{
/>
| > other elements </jsp:useBean>
}
id="beanInstanceName":
这个变量名对大小写敏感
在所定义的范围中确认Bean的变量,id使之能在后面的程序中使用此变量名来分辨不同的Bean
如果Bean已经在别的“<jsp:useBean>”标记中创建,则当使用这个已经创建过Bean时,id的值必须与原来的那个id值一致;否则则意味着创建了同一个类的两个不同的对象
scope="page | request | session | application" :
Bean存在的范围以及id变量名的有效范围,缺省值是page
- page:能在包含“<jsp:useBean>”元素的JSP文件以及此文件中的所有静态包含文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止
- request:在任何执行相同请求的Jsp文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用Request对象访问这个Bean
- session:从创建Bean开始,就能在任何使用相同session的jsp文件中使用这个Bean
- application :从创建Bean开始,就能在任何使用相同application的jsp文件中使用Bean
class="package.class" :
(类)使用new关键字及class构造器从一个class中实例化一个bean
通过类创建实例,这个class不能是抽象的,必须有一个公用的,没有参数的构造器。
type="package.class":
(引用)引用该对象的变量类型,可以是Bean类的名字、超类名字、该类接口名字之一等
如果使用type属性的同时没有使用class或beanName,Bean将不会被实例化,抛出异常
- jsp:useBean执行顺序
步骤1: 在scope属性作用域使用你指定的名称(id属性值)定位Bean对象;
步骤2: 使用id属性值定义一个引用类型变量;
步骤3: 假如找到Bean对象,将其引用给步骤2定义的变量。假如你指定类型(type属性),赋予该Bean对象该类型;
步骤4: 假如没找到,则实例化一个新的Bean对象,并将其引用给步骤2定义的变量。假如该类名(由beanName属性指定的类名)代表的是一个序列化模板(serialized template),该Bean对象由java.beans.Beans.instantiate初始化;
步骤5: 假如< jsp:useBean>此次是实例化Bean对象而不是定位Bean对象,且它有体标记(body tags)或元素(位于< jsp:useBean>和</jsp:useBean>之间的内容,则执行该体标记
getProperty
获得JavaBean的对象的属性的值
- 语法格式
<jsp:getProperty name="beanInstanceName" property="propertyName" />
属性:
1) name="beanInstanceName" bean的ID值,由<jsp:useBean>指定
2) property="propertyName" 所指定的Bean对象的属性名
setProperty
给指定JavaBean的对象的属性赋值
- 语法格式
<jsp:setProperty
name="beanInstanceName"
{
property= "*" |
property="propertyName" [ param="parameterName" ] |
property="propertyName" value="{string | <%= expression %>}"
}
/>
1)name="beanInstanceName"
在“<jsp:useBean>”中id的值,创建的Bean实例的名字。
2) property="*"
指定javabean对象的某个属性名称。
3) value="*"
指定javabean对象的某个属性的值。
3.2 JavaBean应用
四、 中文乱码问题
Java语言编码:UNICODE(16位),支持中文 也 支持英文
常见编码:
-
1) gb2312
中国国家标准总局发布,1981年5月1日实施,通行中国大陆.
收录6763个汉字,一级汉字3755个,二级汉字3008个
生僻字、古汉字无法处理。 -
2) gbk
1995年12月完成GBK规范,兼容GB2312,收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库 -
3)Unicode
国际ISO和UNICODE协会共同制定的统一编码,世界上所有的符号都纳入其中 -
4)UTF-8
是UTNICODE的实现方式,最大的特点,其是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
4.1 乱码原因
4.2 解决乱码
1)信息源、传输过程、目的地保证编码方式的统一;
2)如果不一致,进行相应的转码,使其展示正常;
jsp文件中乱码
- 头文件修改
<%@ page language="java" contentType="text/html; charset=utf-8 pageEncoding="utf-8""%>
- 软件配置修改
Encoding更改为 UTF-8
include 和 forward中文乱码
request.setCharacterEncoding("utf-8");
form表单提交中文乱码
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
五、 Cookie
Cookie:由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)
Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
5.1 特点
1)一个小信息,由服务器写给浏览器的,由浏览器来保存
2)客户端保存的Cookie信息,可以再次带给服务器
3)Cookie类:javax.servlet.http.Cookie
5.2 cookie类中的属性
- name
必须,设置cookie的名字 - value
必须,与cookie关联的值 - comment
可选,cookie注释 - path
可选,设置cookie适用的路径
(如果不设置,当前页面相同目录下所有URL都会返回该Cookie) - domain
可选,该Cookie所属的网站域名 - maximum age
可选,cookie过期时间。
(如果不设置,当前session中有效) - version
可选,版本号
会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话
- 在会话的过程中,状态的保存与管理:
1)cookie将状态保存在客户端
2)session将状态保存在服务器端
5.3 cookie的使用
设置Cookie
-
引入 javax.servlet.http.Cookie类
-
创建一个cookie并进行设置
Cookie cookie=new Cookie(“name”,“独孤求败”);
cookie.setMaxAge(606024); -
通过response告诉客户端cookie
response.addCookie(cookie);
Cookie调用
-
引入 javax.servlet.http.Cookie类
-
通过request获得所有的cookies
Cookie[] cookies = request.getCookies(); -
通过cookies数组查找所有的cookie
for(int i=0;i<cookies.length;i++){
out.println(cookies[i].getName() + “,” + cookies[i].getValue());
}
5.4 cookie应用
浏览器记住用户名和密码
六、 Mysql & JDBC
6.1 JDBC连接sql
- JDBC(Java DataBase Connectivity,Java数据库连接)
用于执行SQL语句的Java API
可以为多种关系数据库提供统一访问
由一组用Java语言编写的类和接口组成
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC-DriverManage
- DriverManager
包含Driver类,它们已通过调用方法DriverManager.registerDriver对自己进行了注册
所有Driver类都必须包含有一个静态部分
-
1)下载MySQL JDBC驱动程序
地址:https://www.mysql.com/products/connector/ -
2)驱动jar包放到合适目录
WebContent->WEB-INF->lib 下 -
3)显示的加载MySQL驱动程序
Class.forName(“com.mysql.jdbc.Driver”);
JDBC-Connection
- Connection
加载Driver类并在DriverManager类中注册后,即可用来与数据库建立连接
当调用DriverManager.getConnection方法发出连接请求时,DriverManager将检查每个驱动程序,查看它是否可以建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/17", "root", "123456");
1) "jdbc:mysql://localhost/17": mysql URL地址
localhost:mysql服务器地址;
17:数据库名;
2) "root": mysql数据库用户名
3) "123456": mysql数据库密码
JDBC-Statement
- Statement
用于将SQL语句发送到数据库中
三种Statement对象
- Statement
执行不带参数的简单SQL语句 - PreparedStatement(从Statement继承而来)
执行带或不带参数的预编译SQL语句; - CallableStatement(从PreparedStatement继承而来)
执行对数据库已存储过程的调用
1)SQL语句
String sql = "select * from tb_user where username=? and password=?";
2)SQL处理和参数传递
pst = conn.prepareStatement(sql);
pst.setString(1, name);
pst.setString(2, pwd);
![在这里插入图片描述](https://img-blog.csdnimg.cn/6946197a0f924d00ae396f25671543da.png)
3)SQL执行
pst.executeQuery();
JDBC-ResultSet
execute方法能返回ResultSet对象,用于存储返回结果
通过对结果集查询,得到需要的值
while(result.next()){
String username = result.getString(“username”);
String password = result.getString(“password”);
}
1)while循环判断结果集有没有
2)result.getString(“username”):得到当前结果集记录中,数据库字段为username的值
JDBC登录判断
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.PreparedStatement"%>
<%@ page import="java.sql.ResultSet"%>
<%@ page import="java.sql.SQLException"%>
Boolean flag = false;
Connection conn=null;
PreparedStatement pst = null;
ResultSet result = null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/StudentInfo", "root", "123456");
String sql = "select * from user where username=? and password=?";
pst = conn.prepareStatement(sql);
pst.setString(1, username);
pst.setString(2, pwd);
result = pst.executeQuery();
while(result.next()){
flag = true;
}
conn.close();
pst.close();
result.close();
if(flag==true){
session.setMaxInactiveInterval(30);
Cookie usercookie = new Cookie("username",username);
Cookie pwdcookie = new Cookie("pwd",pwd);
usercookie.setMaxAge(60*60*24);
pwdcookie.setMaxAge(60*60*24);
response.addCookie(usercookie);
response.addCookie(pwdcookie);
}
6.2 JDBC增删改查
增
index.jsp
//引入Jquery、Jquery artDialog、Jquery DateTimePicker
<script type="text/javascript" src="../js/jquery-3.4.0.min.js"></script>
<script src="../js/artDialog/jquery.artDialog.js?skin=default"></script>
<script src="../js/datetimepicker/jquery.datetimepicker.js"></script>
<link rel="stylesheet" type="text/css" href="../css/datetimepicker/jquery.datetimepicker.css"/>
//新增用户对话框关联学生信息信息表单
insertConfirm.jsp:
//接受index.jsp中Form表单传递的参数
String stunum = request.getParameter("stunum");
String stuname = request.getParameter("stuname");
stuname = new String(stuname.getBytes("ISO-8859-1"),"UTF-8");
String gender = request.getParameter("gender");
String datepicker = request.getParameter("datetimepicker");
Date date=Date.valueOf(datepicker);
//定义数据库操作对象,连接数据库
Connection conn=null;
PreparedStatement pst=null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/studentinfo","root","123456");
//写插入SQL,参数传入,执行SQL
String sql = "insert into tb_student(stunumber,name,birthday,gender) values(?,?,?,?)";
pst= conn.prepareStatement(sql);
pst.setString(1, stunum);
pst.setString(2, stuname);
pst.setDate(3, date);
pst.setInt(4, Integer.parseInt(gender));
pst.executeUpdate();
//关闭数据库连接,跳转至index.jsp
conn.close();
pst.close();
<jsp:forward page="index.jsp"/>
删
index.jsp
//单击删除,当前选择记录的学生ID为参数,通过artDialog提示
<a href="#" onclick="ShowDelete(<%=id%>)">删除</a>
function ShowDelete(id){
$.ajax({
...//跳到query.jsp中查询
});
}
//获得Ajax请求返回值,对其值进行解析
//delete.jsp,单击弹框确定按钮,删除
delete.jsp
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Date" %>
String id = request.getParameter("id");
//连接sql、传参、执行删除、关闭资源
Connection conn=null;
PreparedStatement pst=null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/studentinfo","root","123456");
String sql = "delete from tb_student where id = ?";
pst= conn.prepareStatement(sql);
pst.setInt(1, Integer.parseInt(id));
pst.executeUpdate();
conn.close();
pst.close();
//更新成功,跳转页面
<jsp:forward page="index.jsp"/>
改
index.jsp
//单击修改,当前选择记录的学生ID为参数,通过Ajax查找信息
<a href="#" onclick="ShowUpdate(<%=id%>)">修改</a>
function ShowUpdate(id){
$.ajax({
...//跳到query.jsp中查询
});
}
//获得Ajax请求返回值,对其值进行解析
//updateStudent.jsp,单击弹框确定按钮,提交FORM表单信息,更新
query.jsp
//query.jsp获得Ajax请求,根据ID查询信息并把信息返回页面
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
String strId = request.getParameter("id");
Integer id = Integer.parseInt(strId);
Boolean flag = false;
Connection conn=null;
PreparedStatement pst=null;
ResultSet result=null;
Integer stuId=0;
String stuNumber=null;
String stuName=null;
Integer stuGender=1;
String birthday=null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/studentinfo","root","123456");
String sql = "select id,stunumber,name,gender,
DATE_FORMAT(birthday,'%Y-%m-%d') as birthday
from tb_student where id=?";
pst= conn.prepareStatement(sql);
pst.setInt(1, id);
result = pst.executeQuery();
while(result.next()){
stuId = result.getInt("id");
stuNumber = result.getString("stunumber");
stuName = result.getString("name");
stuGender = result.getInt("gender");
birthday = result.getString("birthday");
}
conn.close();
pst.close();
result.close();
out.println(stuId + "," + stuNumber + "," + stuName + "," + stuGender + "," + birthday);
updateStudent.jsp
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Date" %>
String stuid=request.getParameter("stuid");
String stunum = request.getParameter("stunumupdate");
String stuname = request.getParameter("stunameupdate");
stuname = new String(stuname.getBytes("ISO-8859-1"),"UTF-8");
String gender = request.getParameter("genderupdate");
String datepicker = request.getParameter("datetimepickerupdate");
Date date=Date.valueOf(datepicker);
//连接sql、传参、执行更新、关闭资源
...
//更新成功,跳转页面
<jsp:forward page="index.jsp"/>
查
index.jsp
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Date" %>
//定义变量
Connection conn=null;
PreparedStatement pst=null;
ResultSet result=null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/studentinfo","root","123456");
//定义SQL,进行查询,并解析返回结果
String sql = "select * from tb_student";
pst= conn.prepareStatement(sql);
result = pst.executeQuery();
while(result.next()){
int id = result.getInt("id");
String stunum = result.getString("stunumber");
String name = result.getString("name");
Date date = result.getDate("birthday");
int gender = result.getInt("gender");
//结果嵌入到页面中,进行查询,并解析返回结果
<center>
<table border=1>
<tr>
<td>序号</td>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>出生日期</td>
</tr>
。。。。。result解析程序
<tr>
<td><%=id%></td>
<td><%=stunum%></td>
<td><%=name%></td>
<td><%=gender%></td>
<td><%=date%></td>
</tr>
<%
}
conn.close();
pst.close();
result.close();
%>
</table>
</center>
七、 servlet
Servlet是使用Java Servlet接口(API)运行在Web应用服务器上的Java程序
Servlet在服务器上运行以处理客户端请求、业务逻辑并做出响应的程序
-
特点
需要运行在服务器端(TOMCAT)
需要Web容器的支持
Java编写 -
servlet与JSP页面
servlet | JSP页面 |
---|---|
Servlet承担客户请求与业务处理的中间角色,需要调用固定的方法,将动态内容混合到静态之中产生HTML | 在JSP页面中,可直接使用HTML标签进行输出,要比Servlet更具显示层的意义 |
Servlet中需要调用Servlet API接口处理HTTP请求 | JSP页面中直接提供了内置对象进行处理 |
Servlet的使用需要进行一定的配置 | JSP文件通过“.jsp”扩展名部署在容器之中,容器对其自动识别,直接编译Servlet进行处理 |
7.1 生命周期
Servlet是一个单例
Servlet生命周期,可被定义为从创建到毁灭的整个过程
- 实例化 – 创建servlet实例
- 初始化 – init()
只调用一次,在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用 - 处理请求 – service()
执行实际任务的主要方法,Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端 - 服务终止 – destory()
只被调用一次,在 Servlet 生命周期结束时被调用
可以使 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动,在调用后,servlet 对象被标记为垃圾回收 - GC垃圾回收(可看作是服务终止的一部分)
如图描述:
具体过程:
7.2 处理流程
1、客户端使用浏览器(get/post)提交,并调用Servlet的doGet或者doPost方法
2、服务器接收到请求后,如果该Servlet第一次被调用,实例化这个Servlet
3、服务器调用该Servlet对象的service()方法
4、Servlet产生动态的回复内容
5、服务器发送回复内容给客户端浏览器
7.3 构建
基于注解
基于web.xml
-
web.xml中url-pattern路径设置规则:
1 精确匹配
2 路径匹配
3 扩展名匹配
4 缺省匹配 -
优先级
精确匹配 > 路径匹配 > 扩展名匹配 > 缺省
1、精确匹配:<url-pattern>中配置的项必须与url完全精确匹配
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloWorld</url-pattern>
<url-pattern>/helloWorld.jsp</url-pattern>
<url-pattern>/helloWorld.html</url-pattern>
</servlet-mapping>
当在浏览器中输入如下几种url时,都会被匹配到servlet
http://localhost:8080/HelloWorld/helloworld.html
http://localhost:8080/HelloWorld/helloworld.jsp
http://localhost:8080/HelloWorld/helloworld
http://localhost:8080/HelloWorld/helloworld?username=Tom&age=23
2、路径匹配:以“/”字符开头,并以“/ *”结尾的字符串用于路径匹配
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello/ *</url-pattern>
</servlet-mapping>
路径以/hello/开始,后面的路径可以任意。比如下面的url都会被匹配 http://localhost:8080/HelloWorld/hello/hello.html
http://localhost:8080/HelloWorld/hello/hello.action
http://localhost:8080/HelloWorld/hello/hello.jsp
3、扩展名匹配:以“*.”开头的字符串被用于扩展名匹配
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
任何扩展名为jsp或action的url请求都会匹配,比如下面的url都会被匹配
http://localhost:8080/HelloWorld/hello/users.jsp
http://localhost:8080/HelloWorld/hello.action
4、缺省匹配:以上都找不到对应的servlet,就用缺省匹配的servlet
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- tips:
url-pattern映射匹配过程有优先顺序,当有一个servlet匹配成功以后,就不会去理会剩下的servlet了
"/*" 和 “/” 含义并不相同
-
“/*”
路径匹配,并且可以匹配所有request
由于路径匹配的优先级仅次于精确匹配,所以“/*”会覆盖所有的扩展名匹配,很多404错误均由此引起,所以这是一种特别恶劣的匹配模式 -
“/”
是servlet中特殊的匹配模式,该模式有且仅有一个实例
优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request
7.4 servlet类
GenericServlet
public abstract class GenericServlet extends Object
implements Servlet, ServletConfig, Serializable
GenericServlet类是一个抽象类,
·分别实现了Servlet接口与ServletConfig接口
·实现了除service()之外的其他方法
在创建Servlet对象时,可以继承GenericServlet类来简化程序中的代码,但需要实现service()方法。
HttpServlet
public abstract class HttpServlet extends GenericServlet
implements Serializable
HttpServlet类是一个抽象类
·继承了GenericServlet类
·通过对GenericServlet类的扩展,可以很方便地对HTTP请求进行处理及响应
7.5 转发与重定向
重定向:
response.sendRedirect("login.jsp");
转发:
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
例:
1) 新建用户登录Servlet ValidateLogin
2) 通过POST方式处理用户验证(数据库连接验证)
3) 引入数据库包和Servlet中session的包;
4) 获得FORM表单参数;
5) 实现数据库查询;
6) Servlet中的转发与重定向;
7) login.jsp中Form表单提交Servlet;
7.6 过滤器Filter
Servlet过滤器是客户端与目标资源间的中间层组件,用于过滤、拦截客户端的请求与响应信息
只能转发请求,不能直接发出响应
应用场景:
- 1)性能评测
了解servlet从请求到响应之间的时间差 - 2)字符替换
用户输入的特定字符必须过滤并替换为无害字符 - 3)编码设置
请求与响应的编码换成另一种 - 4)用户行为控制
session判断
void doFilter(ServletRequest request, ServletResponse response)throws IOException , ServletException
主要用于将过滤器处理的请求或响应传递给下一个过滤器对象
中文编码转换
session统一验证
7.7 监听器Listener
监听器是一个实现特定接口的java程序
专门用于监听另一个特殊java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行
1)监听域对象自身创建和销毁的监听器;
2)监听域对象中的属性的增加、修改和删除的事件监听器
3)监听绑定到 HttpSession 域中某个对象的状态的事件监听器
ServletContextListener接口
监听 ServletContext对象
相关方法:
1、contextInitialized(ServletContextEvent arg0):在Web应用加载的时候被调用
2、contextDestroyed(ServletContextEvent arg0): 在Web应用卸载的时候被调用
arg0.getServletContext()可获取当前应用的上下文对象
- 作用
对相关资源进行初始化工作
(如创建数据库连接池、创建Spring IOC 容器、读取当前Web应用的初始化参数等)
HttpSessionListener接口
监听 HttpSession对象
相关方法
1、sessionCreated(HttpSessionEvent arg0): Session创建时被调用
2、sessionDestroyed(HttpSessionEvent arg0): Session销毁时被调用
Session什么时候销毁?
关闭服务器、Session过期、手动调用session.invalidate()方法
- 作用
统计在线人数、记录访问日志等
ServletRequestListener接口
监听 ServletRequest对象
相关方法
1、requestInitialized(ServletRequestEvent arg0): Request创建时被调用
2、requestDestroyed(ServletRequestEvent arg0): Request销毁时被调用
每次请求响应会创建一次和销毁一次;即每次刷新页面都会导致Request的创建和销毁
转发是一次响应,可以获取Request的信息
重定向是两次响应,即前一个页面的Request对象和重定向后的页面的Request对象不是同一个对象,因此不能获得前一个对象的Request信息
- 作用
读取参数,记录访问历史等
ServletContextAttributeListener接口
监听SercvletContext对象属性
相关方法
1、attributeAdded(ServletContextAttributeEvent arg0): 当程序把一个属性存入application范围时触发该方法
2、attributeReplaced(ServletContextAttributeEvent arg0): 当程序替换application范围内的属性时将触发该方法
3、attributeRemoved(ServletContextAttributeEvent arg0): 当程序把一个属性从application范围删除时触发该方法
HttpSessionAttributeListener接口
监听 HttpSession对象属性
相关方法
1、attributeAdded(HttpSessionBindingEvent arg0): session.setAttribute("name", "sessionValue")初次创建调用
2、attributeReplaced(HttpSessionBindingEvent arg0): session.setAttribute("name", "newSessionValue")被修改时调用
3、attributeRemoved(HttpSessionBindingEvent arg0):
执行session.removeAttribute("name")时调用
以上三个方法可用arg0.getName()获取属性名arg0.getValue()获取属性值
但是!要注意!在attributeReplaced()中获取的是旧值
ServletRequestAttributeListener接口
监听 ServletRequest对象属性
相关方法
1、attributeAdded(ServletRequestAttributeEvent arg0): request.setAttribute("name", "requestValue")初次创建调用
2、attributeReplaced(ServletRequestAttributeEvent arg0): request.setAttribute("name", "newRequestValue")被修改时调用
3、attributeRemoved(ServletRequestAttributeEvent arg0):
执行request.removeAttribute("name")时调用
以上三个方法中可用arg0.getName()获取属性名arg0.getValue()获取属性值
但是!要注意!在attributeReplaced()中获取的是旧的值
HttpSessionBindingListener接口
监听实现HttpSessionBindingListener接口的的session绑定和解除
相关方法
1、valueBound(HttpSessionBindingEvent arg0): session.setAttribute("name", javaBean)触发绑定方法
2、valueUnbound(HttpSessionBindingEvent arg0): session.removeAttribute("name")触发绑定解除方法
HttpSessionActivationListener接口
实现会话的持久化
前提:实现该接口和序列化接口Serializable,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程;当服务器突然关闭,用户的session就不存在了,即用户就需要重新登录等操作,这样很麻烦,于是我们就需要实现会话的持久化来解决。可以让我们在重新启动服务器之后用户的session还在服务器中存在
相关方法
1、sessionWillPassivate(HttpSessionEvent arg0): 钝化方法,关闭服务器调用的方法
将用户的Session储存到tomcat目录下的/work/Catalina/localhost/项目名下的SESSION.ser文件中
2、sessionDidActivate(HttpSessionEvent arg0): 活化方法,重新启动服务器时调用Session从硬盘回复到内存中,目录下的SESSION.ser文件消失
7.8 定时任务实现
八、 MVC
MVC(Model View Controller):模型(model)-视图(view)-控制器(controller)
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面
在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑
8.1 控制器controller
处理输入(写入数据库记录)
Student:学生信息的JavaBean
- LoginController控制器:通过控制器访问页面
Login:定义访问登录页面的Controller
- IndexController控制器:通过控制器请求所有学生数据,再发页面
StudentIndex:定义访问学生信息列表页面的Controller
- index.jsp
不需要再直接访问数据库,而是得到数据stuList进行展示
8.2 业务服务层(Service)
8.3 数据处理层(Dao)
dao,数据库访问层
2层模型直接在需要的地方进行数据库访问
3层模型通过业务逻辑层调用数据库,程序应用调用业务逻辑层
- UserService
用户业务逻辑处理
- DBUtil
数据库连接和资源释放工具类
- UserDao
用户数据库访问
- StudentService
用户业务逻辑处理