【JSP教程】JSP期末考试复习要点大纲

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 ObjectgetAttribute(String name)返回session对象中与指定名称绑定的对象,如果不存在则返回null
public EnumerationgetAttributeNames()返回session对象中所有的对象名称,其结果是一个Enumeration(枚举)实例
public longgetCreationTime()返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
public StringgetId()返回session对象的ID
public longgetLastAccessedTime()返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
public intgetMaxInactiveInterval()返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
public voidinvalidate()将session无效化
public voidremoveAttribute(String name)移除session中指定名称的对象
public voidsetAttribute(String name, Object value)使用指定的名称和值来产生一个对象并绑定到session中
public voidsetMaxInactiveInterval(int interval)用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效;

2.4 内置对象–out

在浏览器客户端输出内容(页面缓冲区输入,当缓冲区满或者页面执行结束时,将缓冲区的内容输出)

常见方法:

类型方法描述
voidprintln()向客户端打印字符串
voidflush()将缓冲区内容输出到客户端
voidclear()清除缓冲区,在flush()方法之后调用会异常
voidclearBuffer()清除缓冲区,在flush()之后调用不会异常
intgetBufferSize()返回缓冲区字节数大小

在这里插入图片描述
在这里插入图片描述

JspWriter(out) 和 PrintWriter(response.Writer)区别

  • 1)所有页面输出最后都是out输出(JSPWriter);
    response.Writer输出是PriterWriter输出;

  • 2)out输出是先往页面缓冲区中写,缓冲区满或者页面执行结束,
    然后再输出;
    response.Writer是直接输出。


2.5 内置对象–application

实现用户之间数据的共享,为全局变量

Tomcat服务器的启动和关闭决定了application的生命周期

常见方法:

类型方法描述
public ObjectgetAttribute(String name)返回applicaltion对象中与指定名称绑定的对象,如果不存在则返回null
public EnumerationgetAttributeNames()返回applicaltion对象中所有的对象名称,其结果是一个Enumeration(枚举)实例
public voidsetAttribute(String name ,Object value)设置application属性及其值
public voidremoveAttribute(String name)删除applicaltion对象中属性及其对应的值
public StringgetServerInfo()返回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”);
}

1while循环判断结果集有没有

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页面

servletJSP页面
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对象

相关方法:
1contextInitialized(ServletContextEvent arg0):在Web应用加载的时候被调用
2contextDestroyed(ServletContextEvent arg0): 在Web应用卸载的时候被调用

arg0.getServletContext()可获取当前应用的上下文对象
  • 作用
    对相关资源进行初始化工作
    (如创建数据库连接池、创建Spring IOC 容器、读取当前Web应用的初始化参数等)

HttpSessionListener接口

监听 HttpSession对象

相关方法
1sessionCreated(HttpSessionEvent arg0)Session创建时被调用
2sessionDestroyed(HttpSessionEvent arg0)Session销毁时被调用

Session什么时候销毁?
关闭服务器、Session过期、手动调用session.invalidate()方法

  • 作用
    统计在线人数、记录访问日志等

ServletRequestListener接口

监听 ServletRequest对象

相关方法
1requestInitialized(ServletRequestEvent arg0)Request创建时被调用
2requestDestroyed(ServletRequestEvent arg0)Request销毁时被调用

每次请求响应会创建一次和销毁一次;即每次刷新页面都会导致Request的创建和销毁

转发是一次响应,可以获取Request的信息
重定向是两次响应,即前一个页面的Request对象和重定向后的页面的Request对象不是同一个对象,因此不能获得前一个对象的Request信息

  • 作用
    读取参数,记录访问历史等

ServletContextAttributeListener接口

监听SercvletContext对象属性

相关方法
1attributeAdded(ServletContextAttributeEvent arg0): 当程序把一个属性存入application范围时触发该方法
2attributeReplaced(ServletContextAttributeEvent arg0): 当程序替换application范围内的属性时将触发该方法
3attributeRemoved(ServletContextAttributeEvent arg0): 当程序把一个属性从application范围删除时触发该方法
   

HttpSessionAttributeListener接口

监听 HttpSession对象属性

相关方法
1attributeAdded(HttpSessionBindingEvent arg0): session.setAttribute("name", "sessionValue")初次创建调用
2attributeReplaced(HttpSessionBindingEvent arg0): session.setAttribute("name", "newSessionValue")被修改时调用
3attributeRemoved(HttpSessionBindingEvent arg0): 
执行session.removeAttribute("name")时调用

以上三个方法可用arg0.getName()获取属性名arg0.getValue()获取属性值
但是!要注意!在attributeReplaced()中获取的是旧值

ServletRequestAttributeListener接口

监听 ServletRequest对象属性

相关方法
1attributeAdded(ServletRequestAttributeEvent arg0): request.setAttribute("name", "requestValue")初次创建调用
2attributeReplaced(ServletRequestAttributeEvent arg0): request.setAttribute("name", "newRequestValue")被修改时调用
3attributeRemoved(ServletRequestAttributeEvent arg0): 
执行request.removeAttribute("name")时调用

以上三个方法中可用arg0.getName()获取属性名arg0.getValue()获取属性值
但是!要注意!在attributeReplaced()中获取的是旧的值

HttpSessionBindingListener接口

监听实现HttpSessionBindingListener接口的的session绑定和解除

相关方法
1valueBound(HttpSessionBindingEvent arg0): session.setAttribute("name", javaBean)触发绑定方法
2valueUnbound(HttpSessionBindingEvent arg0): session.removeAttribute("name")触发绑定解除方法

HttpSessionActivationListener接口

实现会话的持久化

前提:实现该接口和序列化接口Serializable,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程;当服务器突然关闭,用户的session就不存在了,即用户就需要重新登录等操作,这样很麻烦,于是我们就需要实现会话的持久化来解决。可以让我们在重新启动服务器之后用户的session还在服务器中存在


相关方法
1sessionWillPassivate(HttpSessionEvent arg0): 钝化方法,关闭服务器调用的方法
将用户的Session储存到tomcat目录下的/work/Catalina/localhost/项目名下的SESSION.ser文件中
2sessionDidActivate(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
    用户业务逻辑处理
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selcouther

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值