JavaWeb - JDBC - JDBC模板,CallableStatement,CLOB/BLOB,JSP访问数据库,JavaBean,MVC设计模式,Servlet

jdbc总结(模板、八股文):

try{

  1. 导入驱动包、加载具体驱动类Class.forName("具体驱动类");
  2. 与数据库建立连接connection = DriverManager.getConnection(...);
  3. 通过connection,获取操作数据库的对象(Statement\preparedStatement\callablestatement)
    stmt = connection.createStatement();
  4. (查询)处理结果集rs = pstmt.executeQuery();
    while(rs.next()){ rs.getXxx(..) ;}
    }catch(ClassNotFoundException e )
    { …}
    catch(SQLException e)
    {…
    }
    catch(Exception e)
    {…
    }
    finally
    {
    //打开顺序,与关闭顺序相反
    if(rs!=null)rs.close();
    if(stmt!=null) stmt.close();
    if(connection!=null)connection.close();
    }

jdbc中,除了Class.forName() 抛出ClassNotFoundException,其余方法全部抛SQLException

CallableStatement

CallableStatement:调用 存储过程、存储函数
connection.prepareCall(参数:存储过程或存储函数名)
参数格式:

  • 存储过程(无返回值return,用out参数替代):
    { call 存储过程名(参数列表) }
  • 存储函数(有返回值return):
    { ? = call 存储函数名(参数列表) }
create or replace procedure addTwoNum 
( num1  in number,num2  in number,result out number )  -- 1 + 2 ->3
as
begin
	result := num1+num2 ;
end ;
/

强调:
如果通过sqlplus 访问数据库,需要开启:OracleServiceSID
通过其他程序访问数据(sqldevelop、navicate、JDBC),需要开启:OracleServiceSID、XxxListener

JDBC调用存储过程的步骤:

a.产生 调用存储过程的对象(CallableStatement) cstmt = connection.prepareCall( "..." ) ;
b.通过setXxx()处理 输出参数值 cstmt.setInt(1, 30);
c.通过 registerOutParameter(...)处理输出参数类型
d.cstmt.execute()执行
e.接受 输出值(返回值)getXxx()

调存储函数:

create or replace function addTwoNumfunction 
( num1  in number,num2  in number)  -- 1 + 2 
return number
as
	result number ;	
begin
	result := num1+num2 ;
	return result ;
end ;
/
  • JDBC调用存储函数:与调存储过程的区别:
    在调用时,注意参数:
"{? =  call addTwoNumfunction	(?,?) }"

处理CLOB/BLOB类型

处理稍大型数据:

a. 存储路径 E:\JDK_API_zh_CN.CHM

  • 通过JDBC存储文件路径,然后 根据IO操作处理
  • 例如:JDBC将 E:\JDK_API_zh_CN.CHM 文件 以字符串形式“E:\JDK_API_zh_CN.CHM”存储到数据库中
  • 获取:
    1. 获取该路径“E:\JDK_API_zh_CN.CHM”
    2. IO

b.
CLOB:大文本数据 (小说->数据)
BLOB:二进制

clob:大文本数据 字符流 Reader Writer


  • a.先通过pstmt? 代替小说内容 (占位符)
    b.再通过pstmt.setCharacterStream(2, reader, (int)file.length()); 将上一步的?替换为 小说流, 注意第三个参数需要是 Int类型

  • 取:
    a.通过Reader reader = rs.getCharacterStream("NOVEL") ; 将cloc类型的数据 保存到Reader对象中
    b. 将Reader通过Writer输出即可。

blob:二进制 字节流 InputStream OutputStream
与CLOB步骤基本一致,区别:setBinaryStream(...) getBinaryStream(...)

JSP访问数据库

JSP就是在html中嵌套的java代码,因此 java代码可以写在jsp中(<% … %>)

导包操作:

  • java项目 :
  1. Jar复制到工程中
  2. 右键该Jar :build path ->add to build Path
  • Web项目:>

jar复制到WEB-INF/lib

核心:就是将 java中的JDBC代码,复制到 JSP中的<% … %>

注意:如果jsp出现错误:The import Xxx cannot be resolved

尝试解决步骤:

  1. (可能是Jdk、tomcat版本问题) 右键项目->build path,将其中 报错的 libary或Lib 删除后 重新导入
  2. 清空各种缓存:右键项目->Clean tomcat… clean (Project -clean或者 进tomcat目录 删除里面work的子目录)
  3. 删除之前的tomcat,重新解压缩、配置tomcat,重启计算机
  4. 如果类之前没有包,则将该类加入包中

JavaBean

  • 刚才我们将 jsp中 登录操作的代码 转移到了LoginDao.java;其中LoginDao类 就称之为JavaBean。

  • JavaBean的作用:a.减轻的jsp复杂度 b.提高代码复用(以后任何地方的 登录操作,都可以通过调用LoginDao实现)

  • JavaBean(就是一个Java类)的定义:满足一下2点 ,就可以称为JavaBean

    1. public 修饰的类 ,public 无参构造
    2. 所有属性(如果有) 都是private,并且提供set/get (如果boolean 则get 可以替换成is)

使用层面,Java分为2大类:

  1. 封装业务逻辑的JavaBean (LoginDao.java封装了登录逻辑) 逻辑
    可以将jsp中的JDBC代码,封装到Login.java类中 (Login.java)

  2. 封装数据的JavaBean (实体类,Student.java Person.java ) 数据 对应于数据库中的一张表
    Login login = new Login(uname,upwd) ;//即用Login对象 封装了2个数据(用户名 和密码)

封装数据的JavaBean 对应于数据库中的一张表 (Login(name,pwd))
封装业务逻辑的JavaBean 用于操作 一个封装数据的JavaBean

可以发现,JavaBean可以简化 代码(jsp->jsp+java)、提供代码复用(LoginDao.java)

优化

public  void sleep(String name,String place, int time)
{

}

public  void sleep(Person per)
{
	per.getName()
	per.getPlace()
	...
}

MVC设计模式:

M Model ,模型 :一个功能。用JavaBean实现。
V: View,视图: 用于展示、以及与用户交互。使用html js css jsp jquery等前端技术实现
C: Controller,控制器 :接受请求,将请求跳转到模型进行处理;模型处理完毕后,再将处理的结果

返回给 请求处 。 可以用jsp实现, 但是一般建议使用 Servlet实现控制器。

Jsp->Java(Servlet)->JSP

Servlet

Java类必须符合一定的 规范:

  1. 必须继承 javax.servlet.http.HttpServlet
  2. 重写其中的 doGet()doPost()方法

doGet(): 接受 并处 所有get提交方式的请求
doPost():接受 并处 所有post提交方式的请求

Servlet要想使用,必须配置

  • Serlvet2.5:web.xml
  • Servle3.0: @WebServlet

Serlvet2.5:web.xml:

项目的目录:WebContent 、src

<a href=“WelcomeServlet”>所在的jsp是在 WebContent目录中,因此 发出的请求WelcomeServlet 是去请求项目的根目录。

Servlet流程:
请求 -> <url-pattern> -> 根据<servlet-mapping>中的<servlet-name> 去匹配 <servlet> 中的<servlet-name>,然后寻找到<servlet-class>,求中将请求交由该<servlet-class>执行。

  1. 回顾纯手工方法创建第一个Servlet
    步骤:
    编写一个类,继承HttpServlet
    重写doGet()doPost()方法
    编写web.xml 中的servlet映射关系

  2. 借助于Eclipse快速生成Servlet
    直接新建Servlet即可!

(继承、重写、web.xml 可以借助Eclipse自动生成)

Servlet3.0,与Servlet2.5的区别:

  • Servlet3.0不需要在web.xml中配置,但 需要在 Servlet类的定义处之上编写 注解@WebServlet(“url-pattern的值”)
  • 匹配流程: 请求地址 与@WebServlet中的值 进行匹配,如果匹配成功 ,则说明 请求的就是该注解所对应的类
  1. 项目根目录:WebContent、src(所有的构建路径)
    例如:
    WebContent中有一个文件index.jsp
    src中有一个Servlet.java
    如果: index.jsp中请求 <a href="abc">...</a> ,则 寻找范围:既会在src根目录中找 也会在WebContent根目录中找
    如果:index.jsp中请求<a href="a/abc"></a>,寻找范围:先在src或WebContent中找a目录,然后再在a目录中找abc

web.xml中的 /:代表项目根路径
http://localhost:8888/Servlet25Project/
jsp中的/: 服务器根路径
http://localhost:8888/

构建路径、WebContent:根目录

  1. Servlet生命周期:5个阶段
    在这里插入图片描述
步骤 功能
加载 自动
初始化 init() ,该方法会在 Servlet被加载并实例化的以后 执行
服务 service() ->doGet() doPost()
销毁 destroy(), Servlet被系统回收时执行
卸载 自动
  • init():
    a.默认第一次访问 Servlet时会被执行 (只执行这一次)
    b.可以修改为 Tomcat启动时自动执行

i.Servlet2.5: web.xml

		<servlet>
				...
  				 //其中的“1”代表第一个。
  				 <load-on-startup>1</load-on-startup>
    	</servlet>

ii.Servlet3.0

@WebServlet( value="/WelcomeServlet" ,loadOnStartup=1  )
  • service() ->doGet() doPost :调用几次,则执行几次
  • destroy():关闭tomcat服务时,执行一次。
  1. Servlet API : 由两个软件包组成
  • 对应于HTTP协议的软件包
  • 对应于除了HTTP协议以外的其他软件包

即Servlet API可以适用于 任何 通信协议。
我们学习的Servlet,是位于javax.servlet.http包中的类和接口,是基础HTTP协议。

  1. Servlet继承关系
    在这里插入图片描述
    ServletConfig:接口
  • ServletContext getServletContext():获取Servlet上下文对象 application
  • String getInitParameter(String name):在当前Servlet范围内,获取名为name的参数值(初始化参数)

ServletContext中的常见方法(application):

  • getContextPath():相对路径
  • getRealPath():绝对路径
  • setAttribute() 、getAttribute()
    —>
  • String getInitParameter(String name);在当前Web容器范围内,获取名为name的参数值(初始化参数)

Servlet3.0方式 给当前Servlet设置初始值:

@WebServlet( .... , initParams= {@WebInitParam(name="serveltparaname30",value="servletparavalue30")   }   )

注意,此注解只 隶属于某一个具体的Servlet ,因此无法为 整个web容器设置初始化参数 (如果要通过3.0方式设置 web容器的初始化参数,仍然需要在web.xml中设置)

  • HttpServletRequest中的方法:(同request),例如setAttrite()、getCookies()、getMethod()
  • HttpServletResponse中的方法:同response
    在这里插入图片描述

Servlet使用层面:

Eclipse中在src创建一个Servlet,然后重写doGet() doPost()就可以 (doGet() doPost()只需要编写一个)。

发布了41 篇原创文章 · 获赞 1 · 访问量 566

猜你喜欢

转载自blog.csdn.net/qq_41620020/article/details/104890013