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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雪落 初级黑马   /  2018-5-21 15:01  /  414 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

web第三次笔记
# JDBC

## JDBC开发流程
```java
step1:注册驱动:Class.forName()
step2:获得连接:Connection conn = DriverManger.getConnection(url,username,password)// Connection java.sql包下的
step3:编写SQL语句,String sql ="",以前的值的地方用占位符代替  ?就是占位符
step4:预编译sql并且获得可执行sql语句的对象PreparedStatement ps = conn.prepareStatemet(String sql)
step5:为sql语句设置值,用值代替sql语句中的?   ps.setXXX(int n,值) n:代表第几个问号的意思,n从1开始
step6:执行sql语句
        如果是查询:ResutSet rs = ps.executeQuery();
                遍历结果集:
        while(rs.next()){
                rs.getXXX(String columnName)/rs.getObject(String columnName) ;
                //columnName默认是表地段名,如果取了别名,用别名
        }
        如果是增删改:int num = ps.executeUpdate() ;// num 代表影响的行数
step7:释放资源
```
## 工具类的抽取:Properties对象的使用
```java
Properties prop = new Properties();
prop.load(new FileInputStream(String path));
prop.getProperty(String key)
   属性文件:.properties
key=value
aaa=adfadf
bbb=dafda
```背后的思想:程序的解耦和
## 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)
```
## 查询
```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.selectSignalNode(String xpathExpression)
xpathExpression:
        //元素名称   
        //元素名称[@属性名称]
        //元素名称[@属性名称='属性值']
```
# 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有关系

## 生命周期(面试点一)

一定要会表述:

## 程序优化的思想:

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

## 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

如何获得:在有servlet的环境下:this.getServletContext();

范围:整个web应用的范围

### 域对象存取数据

setAttribute(String name,Object value);

Object      getAttribute(String name);

removeAttribute(String name)

### 读取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();
模板代码:
通过response设置状态码:setStatus(int status);
通过response设置响应头:setHeader(String name,String value);,setIntHeader(String name,int value),setDateHeader(String name,long date);
通过response设置响应体:getOutputStream(),getWriter();
```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();
###request何时创建和销毁的

1.创建:从客户端向服务器发送请求.那么服务器创建一个request对象.

2.销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.

3.作用范围:一次请求.

### 获取表单参数

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.跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页

## 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");
}
```

## 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
### 三大指令:
执行JSP的过程:
JSP翻译成Servlet,编译这个Servlet的类,生成class文件.得到执行.
JSP中有三个指令:page指令, include指令, taglib指令
​        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类,有一个执行结果

动态包含:各自分别去翻译,各自执行,最终包含的是执行的结果

## 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 个回复

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