A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© kunwenli 中级黑马   /  2018-5-21 15:47  /  629 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-5-23 14:49 编辑

web阶段笔记
#--day11--
#事务管理的核心思想:

  业务逻辑的操作要使用同一个Connection对象
#事务管理的核心操作步骤:
  Connection:conn
  开启事务:
  conn.setAutoCommit(false)
  提交事务:(提交成功不会执行回滚)
  conn.commit()
  一旦有异常,回滚事务:(如果提交前有异常,则会执行回滚)
  conn.rollback()

#装饰者模式:
两个类(实现类,包装类)共同实现一个接口:在包装类中获得实现类的引用
interface Waiter{
        public void server();
}
public class Waitress implements Waiter{
        public void server(){
                System.out.println(“服务中…”);
}
}
public class WaitressWrapper implements Waiter{
        private Waiter waiter;
        public WaitressWrapper(Waiter waiter){
                this.waiter = waiter;
}
        public void server(){
                System.out.println(“微笑…”)
                waiter.server();
}
}
#使用装饰者模式增强Connection中的close方法
为了简化编程,提供了一个模板类(模板类原封不动的将接口中的所有方法都实现,但是都没有增强),编写一个装饰类继承模板类,在装饰类中只需要增强某一个方法即可
例如:
#增强连接:
MyConnectionWrapper connWrapper = new MyConnectionWrapper(conn, connList);
## JDBC的事务管理

事务的管理的对象:Connection conn

### 事务管理的核心的思想:

逻辑上的一组操作使用的是同一个Connection对象

### 事务管理的核心步骤:

开启事务:conn.setAutoCommit(false)

业务逻辑的操作

所有的业务逻辑操作都成功后提交事务:conn.commit()

一旦有异常回滚事务:conn.rollback()

# 连接池

## druid/c3p0


1.导包

2.配置文件:在classpath下默认有个一个文件叫 c3p0-config.xml

```xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
        <default-config>
                <property name="driverClass">com.mysql.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql:///web_test4</property>
                <property name="user">root</property>
                <property name="password">tsmysql</property>
               
                <property name="initialPoolSize">5</property>
                <property name="minPoolSize">5</property>
                <property name="maxPoolSize">20</property>
        </default-config>
</c3p0-config>
```

3.java

```java
ComboPooledDataSource dataSource = new ComboPooledDataSource();
```
# DBUTILS(web阶段使用)

## 增删改


```java
QueryRunner qr = new QueryRunner(DataSource dataSource)
qr.update(String sql,Object ... obj)
```
#--day12--

1.
如果自己创建的实体类与表的列名不同
可以as列名,起别名
2.
自己创建类,如果自己重写了有参构造,则还需要重写无参构造,如果不重写有参构造,类中默认有无参构造
3.
在实现实体类时,是通过set,get方法,而不是属性名
4.
    //new BeanHandler<Usern>后面的(Usern.class)通过映射实现
        @Test
        public void demo3() throws SQLException{
                //将一条记录封装到一个实体类即javabean中
                //封装类需要用到类的无参
                QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
                Usern usern = queryRunner.query("select * from usern where id = ?", new BeanHandler<Usern>(Usern.class),2);
                System.out.println(usern);
        }
        @Test
        public void demo4() throws SQLException{
                //将多条记录封装到一个带有实体类即javabean的集合中
                QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
                List<Usern> usern= queryRunner.query("select * from usern", new BeanListHandler<Usern>(Usern.class));
                //集合需要遍历
                for (Usern usern2 : usern) {
                        System.out.println(usern2);
                }
        }
        @Test
        public void demo5() throws SQLException{
                QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
        //一个map
                Map<String, Object> map = queryRunner.query("select * from usern where id = ?", new MapHandler(),2);
                System.out.println(map);
        }
        @Test
        public void demo6() throws SQLException{
                QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
                //多个map
                List<Map<String, Object>> list = queryRunner.query("select * from usern", new MapListHandler());
                for (Map<String, Object> map : list) {
                        System.out.println(map);
                }
        }
5.
# DBUTILS(web阶段使用)
## 增删改

```java
QueryRunner qr = new QueryRunner(DataSource dataSource)
qr.update(String sql,Object ... obj)
```
## 查询

```java
QueryRunner qr = new QueryRunner(DataSource dataSource)
qr.query(String sql,各种Handler,Object...obj)
结果集类型:
        BeanHandler
        BeanListHandler
        MapHandler
        MapListHandler
        ScalarHandler:Long         
```
# XML
## 解析:DOM4j+Xpath


```java
SAXReader sr = new SAXReader()
Document document =  sr.read("代表这个xml文档的流");
List<Node> list = document.selectNodes(String xpathExpression)
Node node =  document.selectSingleNode(String xpathExpression)
xpathExpression:
        //元素名称   
        //元素名称[@属性名称]
        //元素名称[@属性名称='属性值']

        @Test
    /**
         * DOM4J的XPath的写法:
         */
        public void demo1() throws Exception{
                SAXReader reader = new SAXReader();
                Document document = reader.read("xml/demo1.xml");
                /*List<Node> list = document.selectNodes("//age");
                for (Node node2 : list) {
                        Element element = (Element) node2;
                        System.out.println(element.getText());
                }*/
                Element node = (Element) document.selectSingleNode("//person['@id']");
                System.out.println(node.attributeValue("id"));
        }   
   
```
#--day13--
#【HTTP协议的详解】

        请求部分
* 请求行
    * 提交方式:
        * 提交方式有很多,常用的GET和POST:
        * GET和POST的区别:
            * GET的提交的参数会显示到地址栏上,而POST不显示.
            * GET往往是有大小限制的,而POST没有大小的限制.
            * GET没有请求体,而POST有请求体.
    * 提交路径:
    * 协议版本:
* 请求头
    * 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
    * User-Agent                                :代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.
    * Referer                                :代表的是网页的来源. --- 防盗链.
    * If-Modified-Since                :通常与响应中的头Last-Modified一起使用查找本地缓存.
* 请求体
    * 就是POST提交方式的提交的参数.
        响应部分
* 响应行:
    * 协议版本
    * 状态码                :
        * 200        :成功
        * 302        :重定向
        * 304        :查找本地缓存
        * 404        :资源不存在
        * 500        :服务器内部错误
    * 状态码描述
* 响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.
    * Last-Modified                        :与请求中的If-Modified-Since一起使用查找本地缓存.
    * Content-Dispostion        :文件下载的使用使用的一个头信息.
    * Location                                :重定向的跳转的路径.
    * Refresh                                :定时刷新/定时跳转.
* 响应体:显示浏览器的页面的内容.
在写一个form时,属性action="/web_01/ServletDemo1"
action="http://ip:port/projectName/地址串"  这样写也可以
本地写localhost:8080/项目名/java文件,不加后缀可
# tomcat

## 部署


1.如果要用虚拟路径:

​        tomcat\conf\Catalina\localhost:新建一个xxx.xml ,写  <Context  docBase=""/>   访问路径:xxx

2.将项目导出成war包,直接扔到webapps下

## 协议

### 请求

行 头 体
1.get/post的区别:

​        get提交的参数显示到地址栏,在请求行中地址后面;post提交的参数在请求体中

​        get有大小的限制,post没有

​        get没有请求体,post有

2.常见的请求头:

​        User-agent:浏览器的类型

​        Referer:防盗链

### 响应

行 头 体
1.常见的状态码:

​        302:重定向(结合Location响应头使用)

​        304:查找本地缓存

​        404:路径错误,资源真的不存在

​        500:代码写错了

2.常见的响应头:

​        Location:结合302做重定向

​        Content-Disposition:文件下载的时候用

​        Refresh:定时刷新

# Servlet

## 访问规则:


http://ip:port/projectName/地址串

如果要访问一个servlet,这个地址串跟web.xml中配置的url-pattern有关系

# #

String request.getParameter(String name);

String [] request.getParameterValues(String name);

Map<String,String[]> request.getParameterMap();

#--day14--
## 生命周期(面试点)

一定要会表述:
1.
        Servlet的生命周期:(*****)
        生命周期:就是一个对象从创建到销毁的过程.
        Servlet生命周期:Servlet从创建到销毁的过程.
* 何时创建:用户第一次访问Servlet创建Servlet的实例
* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
        用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,只创建一次,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
        在整个生命周期中Servlet有且只有一个
2.
将耗时的操作放到服务器启动的时候
3.
每种访问路径对应一种访问规则
        Servlet的相关的配置:
【启动时创建Servlet】
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
* <load-on-startup>2</load-on-startup>  --- 传入正整数,整数越小,被创建的优先级就越高.
【url-pattern的配置】
url-pattern配置方式共有三种:
1.完全路径匹配        :
以 / 开始        例如:        /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
2.目录匹配                :
以 / 开始 需要以 * 结束.        例如: /* ,/aaa/* ,/aaa/bbb/*
3.扩展名匹配                :
不能以 / 开始 以 * 开始的. 例如: *.do , *.action
#***** 错误的写法        : /*.do
## 程序优化的思想:


一次性的资源的加载(耗时的操作)放到服务器启动的时候

## url-pattern的配置方式


1.完全路径匹配:以/开头     /aaa        http://ip:port/projectName/aaa

2.目录匹配:以/开头 以*结尾    /aa/ *   http://ip:port/projectName/aa/fadsfadfda

3.扩展名匹配:不能以/开头 以*开头  *.do  *.action  http://ip:port/projectName/afdafdadfadsfadf.do

优先级关系:根本的原因,一次请求只有一次响应

完全路径匹配 > 目录匹配 > 扩展名匹配

## ServetContext


范围:整个web应用的范围

### 域对象存取数据
ServetContext的方法:

setAttribute(String name,Object value);

Object   getAttribute(String name);

removeAttribute(String name)
getResourceAsStream()
getRealPath()
#--day15--
1.
读文件:
有servet环境用:getResourceAsStream()
getRealPath()方法
无servet用类加载器,其中有一个工具类的写法延伸
2.
解决中文乱码问题:
rsponse.getWriter();乱码解决 response.setContentType("text/html;charset=UTF-8");
3.
request:
客户端信息:
请求方式:getMethod();
ip:getremoteAddr();
工程名:getContextPath();
获得表单数据:
String getParameter(String name);
String[] getParameterValues(String name);
String getParameter(String name);
域对象:
3.
### 读取web项目下的文件

1.有servlet的环境下:

​        InpuptStream getResourceAsStream(String path);

​        String getRealPath(String path);

2.如果没有servlet的环境:

​        用类加载器去读取文件:

​        InpuptStream  is = 当前类的类名.class.getClassLoader().getResourceAsStream(String name);

#### 企业级工具类的一个编写思想

## Response

### 文件下载


把一个文件从服务器读取,写到客户端

文件下载的核心思想:io 读/写的操作

InpuptStream is = new FileInputStream("服务器上的路径");

OutputStream os = response.getOutputStream();

模板代码:

```java
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!= -1){
        os.write(b, 0, len);
}
is.close();
```
Content-Type: getServletContext().getMimiType(String filename);
Content-Disposition:"attachment;filename="+filename;

### 响应乱码

response.getOutputStream():文件下载

下列方式:以后不常用

response.getWriter().print("");这种乱码问题如何解决:response.setContentType("text/html;charset=UTF-8");  

## Request

### 获取客户端信息


1.请求方式:request.getMethod();

2.请求ip:request.getRemoteAddr();

3.获取工程名:request.getContextPath();

### 获取表单参数


String request.getParameter(String name);

String [] request.getParameterValues(String name);

Map<String,String[]> request.getParameterMap();

#### 请求乱码


get:
​        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")
post:
​        request.setCharacterEncoding("UTF-8")

### 作为域对象存取数据

范围:一次请求和响应的范围

setAttribute(String name,Object value);

Object      getAttribute(String name);

removeAttribute(String name)

### 转发和重定向(面试点二)
转发:
​        request.getRequestDispatcher("不带工程名的路径").forward(request,response)
重定向:
​        response.sendRedirect("带工程名称的路径")
#### 区别:

1.地址栏:转发地址栏不变,重定向会变

2.请求响应的次数:转发一次请求一次响应,重定向是两次请求和响应

​        如果给request域中存放了数据:转发能够获得到数据,重定向不能获得到数据

3.路径的编写:转发不带工程名,重定向带工程名

4.跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页
#--day16--
1.
在向服务器中带入存入数据时,cookie中想存入中文,就要用到URLEncoder.encode("中文字符串","utf-8编码格式")有返回值
先编码,在存入
在带回到浏览器时,需要解码
用到URLDncoder.decode(获取到的值,"utf-8编码格式")有返回值
先获取值,在编码
2.
## Cookie

如何获得:Cookie[] cookies = request.getCookies();

如何向客户端写cookie:response.addCookie(Coookie cookie)

如何创建cookie:Cookie cookie = new Cookie(String name,String value);

​        获得名字:cookie.getName()

​        获得值:cookie.getValue();

​        设置路径:cookie.setPath(String path);

​        设置有效期:cookie.setMaxAge(int age) 单位是:秒

作用范围:默认是一次会话,关闭浏览器就销毁

关于cookie存储中文的问题:

```java
往回写cookie:
String value = URLEncoder.encode("老谭", "UTF-8");//"老谭"--fadsf%%33
Cookie cookie = new Cookie("aa",value);
response.addCookie(cookie);
获得:
Cookie [] cookies = request.getCookies();
Cookie aa= CookieUtils.findCookie(cookies, "aa");
if(aa!=null){
    String value = aa.getValue();//fadsf%%33--"老谭"
    String a = URLDecoder.decode(value, "utf-8");
}
```
#--day17--
1.
#三大指令:page include taglib
page:
error-page:属性
错误全局设置web.xml
<error-page>
<error-code>404等</error-code>
<localtion>跳转的</localtion>
</error-page>
2.
动作标签
转发:<jsp:forward page="路径 转发不需要写工程名"></jsp:forward>
动态包含:
<jsp:include page="路径"></jsp:include>
3.
## Session
如何获得:HttpSession  session  = request.getSession();
### 作为域对象存取数据
session.setAttribute(String name,Object value);
Object vlaue = session.getAttribute(String name);
removeAttribute(String name);

范围:一次会话(根本原因:存SesssionID的cookie默认是会话级别的)

配置sessionion过期时间:web.xml

```xml
<session-config>
     <session-timeout>5</session-timeout> <!--单位是分钟-->
</session-config>
```
## JSP
### 三大指令:

​        page:
​               全局错误友好页面的配置
```xml
  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>
```



​        include:   <%@ include file="" %> 静态包含

​        taglib:

### 九大内置对象(面试点三):

```java
                        request           HttpServetRequest
                        response                  HttpServetResponse
                        session           HttpSession
                        application       ServletContext
                        page              Object
                        out               JspWriter
                        pageContext       PageContext
                        config            ServletConfig
                        exception         Throwable
```
技能 拔高点:pageContext:
​        1.获取其他8个内置对象:getXXX()方法

​        2.可以向四个域中存取数据:

```java
pageContext.setAttribute("pname", "pvalue", PageContext.PAGE_SCOPE);
pageContext.setAttribute("rname", "rvalue", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("sname", "svalue", PageContext.SESSION_SCOPE);
pageContext.setAttribute("aname", "avalue", PageContext.APPLICATION_SCOPE);


<%= pageContext.getAttribute("pname", PageContext.PAGE_SCOPE) %>
<%= pageContext.getAttribute("rname", PageContext.REQUEST_SCOPE) %>
<%= pageContext.getAttribute("sname", PageContext.SESSION_SCOPE) %>
<%= pageContext.getAttribute("aname", PageContext.APPLICATION_SCOPE) %>

```
### 动作标签:

<jsp:forward page=""> </jsp:forward>

<jsp:include page=""></jsp:include> :动态包含

###静态包含和动态包含的区别(面试点四)

静态包含:相当于源代码的拷贝,只会翻译成一个Java类,有一个执行结果

动态包含:各自分别去翻译,各自执行,最终包含的是执行的结果
#--day18--
## EL&JSTL


### EL获取数据

以什么名字存到域中,就以什么名字取出来,存进去是什么类型的,取出来就是什么类型

数组,List:[]  ----遍历
map,java对象:.  .属性

### EL执行运算

empty:判断是否为空

not empty:判断是否不为空

lt小于 gt大于 le小于等于 ge大于等于 eq等于

### EL操作常用的web对象

${cookie.名字.value}

${pageContext.request.contextPath}
### JSTL的中判断
```xml
<c:if test="${}">
            test:如果test返回true,标签内的内容就会被输出
</c:if>
if标签没有else,如果想表达else的情况,从条件着手
```
### JSTL中的遍历

```xml
<c:forEach var="" items="" varStatus="status">
    status.index
    status.count 用它来取余或是其他对比及操作等
</c:forEach>
<c:forEach var="" begin="" end="" step="" varStatus="status">
</c:forEach>
```

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马