黑马程序员技术交流社区

标题: 【石家庄校区】web笔记 [打印本页]

作者: 黑马7期班长    时间: 2018-5-21 15:23
标题: 【石家庄校区】web笔记
web



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,setPasswordC3P0连接池配置文件

创建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, &quot;Liberation Mono&quot;, 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类型
MapListHandlerxmlxml介绍可扩展标记语言
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的apiDOM4J重要//创建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-1setStatus(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}











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2