jdbcjUnit.jar 测试用的jar包,方法上加@Test public void 不带参数;
Connection对象方法
createStatement();//返回statement
prepareStatement(sql);//静态方法直接用。调用
执行sql
execute();//执行所有查询 返回boolean类型
executeQuery();//返回结果集 ResultSet
executeUpate//返回更新行数
prooerties配置对象配置文件
properties properties = new properties();
properties.load(new FileInputStream("//文件路径"));
properties.
1.属性文件
格式:扩展.properties
内容 key = value;
2.xmlstatement 有漏洞不建议使用
实现sql注入漏洞 statement
在前台可以sql注入
select id as ‘姓名’ from user where name lile ?
别名查询时候用别名
rs.getString("姓名")
mysql 默认情况下不开启批处理
事务
高可用,高性能
Connection 数据库连接对象
事务核心:操作的conn对象必须是同一个对象
con.setAutoCommit(false);//开始事务
con.commit();
一旦出现异常就回滚
con.rollback();
连接池缓冲connection接口。 //线程获取connection装有连接的容器,使用完再归还给连接池,创建销毁特别耗资源。
服务器初始化就初始化连接。
装饰者模式 Connection
不知道实现类 我们的类都要继承Connection
要增强还有需要模板类
Druid连接池加载jar包
手动设置连接池
dataSource.setDriverClass
dataSource.SetUrl
dataSource.setUsername
dataSource,setPassword
C3P0连接池配置文件
创建xml文件c3p0-conflg.xml
创建c3p0对象CombopooledDataSource dataSource = new ComboPooledDataSource("");
.propertiesc3p0
<c3p0-config >
<default - name >
<properties name ="jdbc"></properties
<properties name ="user"></properties>
<properties name ="password"></properties>
<properties name ="jdbc"></properties>
</default-name>
</c3p0-config>
改写工具类1.只需要创建一个连接池对象
Static final CombopooledDataSource dataSource = new CombopooledDataSource();
2.getConnetion(){
return dataSource.getConnection();
}
3.获得连接池
getDataSource(){
retrun dataSource;
}
4.关闭资源操作的是放回连接池中
DBUtilsQueryRunner类
构造
QueryRunner qr = new QueryRunner(DataSource);
qr.query();//查询
qr.update();//更新
---------核心
自定义连接池c3p0
工具包
Druid
装饰者模式
1.1.1自定义连接池的实现步骤
1.1.1.1编写一个类实现DataSource接口
1.1.1.2重写getConnection方法
1.1.1.3初始化多个连接在内存中
1.1.1.4编写归还连接的方法
1.1.2自定义连接池的代码实现
Druid连接池jdbc中如何使用Druid(导入jar包)
使用属性集
Properties pt = new Properties();
pt.load(new FileInputStream("指向配置Druid文件"));
创建连接池利用工厂模式
DataSource ds = DruidDataSourceFactory.createDataSource();
获取con
Connection con = ds.getConnection();
然后操作
C3P0连接池创建ComboPooledDataSource对象
直接获取con
Connection con = ComboPooledDataSource.getConnection();
DBUtilapache编写的开源工具类库
QueryRunner对象 核心运行类
构造方法
1.QueryRunner();
2.QueryRunner(DataSource ds)//传入连接池
成员方法
update(String sql,?)更新方法 返回更新数
update(Connection,sql,?)更新方法 返回更新数
query(sql,Handler<T>,?)查询
使用DBUtil+c3p0操作我的ProductResultSetHandler接口只能存放数据,取的时候不好取
BeanHandler//实体类
BeanListHandler()//实体类列表
ArrayHandler
只能存放一个Object[]数组
ArrayListHandler
List<Object[]>存放多个Object[]
BeanHandller<pre class="md-fences md-end-block" lang=", new beanhandler" contenteditable="false" cid="n47" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 0.9em; break-inside: avoid; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(221, 221, 221); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); position: relative !important;">QueryRunner queryrunner =
queryrunner.query("selectt * from accunt where id = ?",new BeanHandler<BeanHandler>(Account.class))
实体类和表的字段不一致
注意实体类中的别名,还有就是表中的数据要跟实体类相对应
在set字段(传入as)
MapHandler把返回的记录,封装成map
键为表中字段,值为返回值Select count(*) from prodcut 返回值为LONG类型
MapListHandler
xmlxml介绍可扩展标记语言
1.用户可自定义标签
2.设计宗旨为传输数据
3.软件的配置文件
文档声明<?xml version="1.0 encoding="utf-8"?>
standalone 孤独的寂寞的 描述xml是否依赖其他文件<![CDATA[
可以写逻辑,所有字符都会编译成字符
]]>
xml解析方式获取xml的中数据
面试时候会问
*DOM dom:document Object Model
*SAX siple api fro XML
区别dom
将节点加载到内存,dom树,一次性将文档加载到内存,如果内存大,容易导致内存溢出,可以对xml进行增删改
区别sax
事件驱动方式,一行一行解析,只能查询,不会导致内存的溢出。
解析api*JAXP sun公司提供的api
*JDOM 开源API-JDOM
*DOM4J API-DOM4J
*pull 用来解析android的api
DOM4J重要//创建sax解析器
SAXReader sr =new SAXReader();
Document doucument = reader.reader("file.xml");可以传入fileName 和路径
XPathTomCat发布项目三种方式
1.复制到webapps文件下
2.导出.wap
Http协议规定浏览器和服务器之间的数据传递。
显示在浏览器的内容
基于请求和响应的模型
*先有请求后有响应
*默认端口号为80
1.0:每次响应后就会关闭连接
1.1:超过一定时间会关闭,不是每次响应后会挂断
请求包含:
1.请求行
提交方式 :get post
请求地址
http协议版本
2.请求头
User-Agent:用户浏览器类型 文件下载中
Referer:来源,显示从哪个浏览器跳转的。防盗链
If-Modified-Since: 通常与响应中的头Last-Modified一起使用查找本地缓存。
3.请求体
表单中发送的数据
响应:
1.响应行
状态码
200 成功
302 重定向
304 查找本地缓存
404 页面找不到
500 服务器内部错误
http协议版本
状态码描述
2.响应头
键值对 key value
Last-Modified :查找本地缓存
Refresh 定时刷新
Location 重定向要跳转的页面
Content-Disposition :文件下载的头信息
3.响应体
显示在浏览器的内容
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)
get/postget方式没有请求体。
在请求头中一般都是以键值对方式存在。
post方式有请求体。
Servlet接口运行在服务器端的一个小java程序,用来接受和响应客户端发送的请求,一般使用的协议为HTTP,如果是单例,不能创建成员属性,如果有线程,会争抢资源
servlet SUN公司提供的动态网页开发技术
init()//用来初始化公共资源
ServletContext域对象用来对象存取数据,存的数据都是有一定的作用的范围。一般把一些耗时的操作放到服务器启动时init中。
可以用在多个类之间数据的共享;
SetAttribute(String name,Object object)//存入数据
getAttribute(String name)//用来获取数据
removeAttribute(String name)//从ServletContext中移除数据
getReSourceAsStream("");//返回文件的输入流//传入服务器中的属性文件路径
getRealPath("");//返回在磁盘中的绝对路径——----c://.......
this.ServletContext()
getInitParameter();//获取web.xml中全局初始化属性
getInitParameterNames();//获取web.xml中的所有name<paramter-name>
getMimeType();//获取文件的MIME类型
getResourceAsStream(String path);//返回inputStream 根据路径读文件返回文件输入流
getRealPath()//返回String//返回磁盘的绝对路径
一个web工程会创建一个单独的servletcontext对象
<init-parm>标签设置当前serlvet的初始化参数
获得文件的Mime类型,文件上传下载
作为域对象存储数据
用来读取web项目下的文件
类加载器用来加载类,可以将类加载到内存中去。//保证代码没有侵入性(耦合性)
通过当前类.class.getClassLoader().getReSourceAsStream("db.propertites");//返回InputStream对象
类加载器默认加载WEB-INF下的Classes文件比如我们都想公共类中common.properties,就可以封装一个工具类。用类加载器
public static String readValue(String key){
if(key!=null){
try{
InputStream is = 当前类.class.getClassLoad().getReSourceAsStream("common.propertie");
Properties properteis = new Properties();
properties.load(is);
return properites.getProperty(key);
}catch(Exception e)
{
return null;
}
}
}
//比如我想读我的模块的属性文件就可以调用重载方法,传入fileName 和value就可以这样写
public static String readValue(String path,String key){
//判断文件名和key是否为空
if(fileName!=""&&key!="")
{
try{
InputStream is = 当前类.class.getClassLoad().getReSourceAsStream(path);
Properties properties = new Properties();
properties.load(is);
return properties.getProperty(key);
}catch(Exception e){
retrun null;
}
}
}
//这样也可以读取我们自己的properties文件
ServletRequestString getParameter(String name);//获取前台表单中的name属性
String getParameterValues(String name);//请求一个name对应的多个值。
Map getParameterMap();//返回表单中所有值放到map中,一个键对应一个值
setHandler(String name,String value);//设置头信息
addHandler(String name,String value);//添加头信息---覆盖
Respose对象代表响应的对象,从服务器中向页面响应信息Response的字符缓冲区默认编码是iso-8859-1
行setStatus(int num);//设置响应行的状态
头添加头信息
addDateHeader(String name,long date);//向头中添加
addHeader(String name,String value);
addIntHeader(String name,int value);
设置头信息
setDateHander(String name,long date);
setHeader(String name,String value);
setIntHanger(String name,int value);
体getWriter();//以字符流向浏览器输出
getOutPutStream();//以字节流向浏览器输出i
1.下载 好,√ 看完视频
2.转发重定向 他们之间的区别
3.工具类 瞅瞅工具类
4.发表文章
5.注册 ajax实现注册
a标签下载原理,首先需要两个头和一个流,设置响应头信息,下载文件的类型mime,还有一个头是打开文件类型是直接
下载,流是字节流,所有文件的下载都是字节流。
转发 地址栏不变 一次请求 不带工程名 当前项目
重定向 变 两次请求 带工程名 来回跳转、
request对象request.getMethod();//获取表单的提交方式
request.getRemoteAddr();//获取用户的ip地址
request.getContextPath();//获取项目名/Mycast/
request.getRequestURL();//获取全路径的请求地址
request.getRequestURI();//从项目名开始的请求地址
request乱码问题:
post请求,参数是在请求体中,请求体默认编码为iso-8859-1,直接设置request的缓冲区的编码就可以。
request.setCharacterEncoding("UTF-8");
get请求,参数是在地址栏,编码是iso-8859-1,把请求出来的数据专业换成utf-8,3中方法
1.设置tomcat字符集为utf-8(不建议)
2.利用URLEncoder和URLDecoder进行编码和解码
3.使用String的构造方法
String name = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")
编码错误字节流写入
//设置浏览器的头为utf-8 浏览器没有默认编码所有将浏览器设为utf-8
response.setHeader("Content-Type","text/html;charset=utf-8");
response.getOutputStream().writer("中问".getBytes("UTF-8"));
字符流写入
//设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
//设置浏览器默认编码
response.setHeader("Content-Type","text/html;charset=utf-8")
response.getWrite().print("中文");
会话技术会话就是用户打开浏览器,访问很多页面,从打开到关闭浏览器的过程就是一个会话。
cookie简称小饼干,将服务器中的数据保存到客户端。cookie 是浏览器往客户端写数据,用的所以是HttpServletResponse对象
//创建cookie
addCookie(Cookie cookie);
//读取cookie从浏览器往服务读取用的所以是HttpServletRequest对象
getCookie();//返回是一个Cookie的数组
创建cookie//cookie没有无参数构造方法
Cookie cookie = new Cookie(String name,String value);
sessionsession,将数据保存到服务器端。
JSPEnglish name is Java server pages
其他编程语言,比如asp,php 动态网站的出现,使java不得不开发一种动态网站。原有的servlet向页面输出元素比较
繁琐,所以jsp就诞生了。
jsp嵌套java代码的三种方式<%! %> 可以写类,变量,写方法 线程不安全,因为serlvlet是单例的。
<% %> 编译到servlet中service方法中。可以写变量,类,代码块,但是不能写方法
<%= %> 翻译成 getWriter().print() 中间可以写表达式
注释方式//会存在后台,但是生成jsp显示在页面中就会消失
/**/
<%----%>//只会存在在jsp代码中
/** */
jsp的指令<%@ 指令名称 属性名称=“属性值”。。。%>
三个指令
page
设置jsp的参数
contentType:设置浏览器默认打开的字符集
pageEncoding:设置文件保存到本地,或者生成servlet后,servlet保存到硬盘的编码
import导包 impor可以出现多次
include 模板
taglib 引入标签页面
url prefiex=""//标签的别名
//项目写到加入到购物车页面。
//赶紧赶课程
jsp9大内置对象response HttpServletResponse response.getWriter(),response.
request HttpServletRequest request.getParameter();request.sendRediracter();request.getParameterValues();request.getParameterMap();
session HttpSession session.getAttribute().session.getAttribute();session.setAttribute();
application ServletContext ServletContext.getAttribute();
page Object toString()wait()equals()
pageContext PageContext setAttribute()getAttribute()
config ServletConfig getServletName()getServletContext()
out JspWriter print() writer()
exception Throwable message()//错误信息对象
pageContext可以获取到其他8个内置对象
在页面上直接写pageContext.getRequest().......//当写框架时,使代码通用性比较高,就可以传入pageContext
jsp中四个域对象 范围 内置对象 真实对象
requestScope 一次请求 Request HttpServletRequest
sessionScope 一次会话,多次请求 session HttpSession
applicationScope整个web项目 application ServletContext
pageScope 当前页面 page PageContext
面试out 跟 printWriter的区别out有它自己的缓冲区,属于jspwriter,printWriter也有自己的缓冲区,凡是向页面输出都要通过printwriter,他
会先把jspwriter中的缓冲区东西移入到printWriter的缓冲区中,在response到页面。
jsp动作标签标签的作用,简化我们的代码
<jsp:forword/>用于页面的转发
<jsp:include/>用于页面的包含,动态包含
<jsp:param/>用于带有路径的标签下传递参数
<jsp:useBean/>用于在jsp中使用javabean
<jsp:setProperty>用于给Javabean设置属性
<jsp:getProperty>用于获取javabean的属性
Session对象属于域对象,当第一次调用getSession()创建Session,
3中销毁方式
1.过30分钟,默认销毁
2.非正常关闭服务器,拔电源
3.如果点击stopservlet,正常关闭,session会序列话到内存当中,当下次读取时就会反序列化。
调用session.inviladate();获取session中的值
request.getSession().getAttribute("");//中间传入键
设值session的值
request.getSession().setAttribute("","");//传入键和值
session 的作用范围。
一次会话,
JSTL标签库jstl 1.0--不支持el表达式
jstl 1.1,1.2--一般用1.11.2
JSTL和EL作用替换<%%>
JSTL包含5类标签
core(核心标签)
fmt(国际化标签)
xml(标签)
sql(标签)
fn(函数库)
引入jar包
在页面中引入tablib
<c:if test="${条件}"></c:if>
<c:set var="变量名" value="值" scope="存放到那个域"></c:set> ---page request session application
<c:out value="" defaule = "默认值" excapeXml = "boolean>/<c:out> //是否编译成html代码
EL表达式获取数据简化编程,用来获取数据,可以从jsp的四个域中获取数据,执行运算,操作web开发的常用对象${}//这种形式实际上就是调用了findAttribute();从小的域向大的域中查找pageScoperequestScopesessionScopeapplicationScope获取数组${name[1]}获取map${name.aaa}${name.bbb}//当map的key中包含特殊字符时候${map["sss.sss"]}获取集合${List[0].属性}
EL运算
lt gt le ge equals not emplty
EL操作web开发常用的对象四个域对象 pageScope requestScope sessionScope applicationScope接受参数 param paramValues头信息 header headerValuse全局初始化参数 initparampageContextcookie 获取cookie${ Cookie.cookiename.value}