Back

Java笔记之web篇

JavaWeb笔记整理

XML

XML(EXtensible Markup Language):可扩展标记型语言,主要是为了存储数据(程序配置文件)、数据交换

格式:<?xml version="1.0" encoding="utf-8"?>

XML两种文档约束类型: dtd (file_name.dtd)和schema(file_name.xsd 可被XML解析器解析)

XML存储结构化信息,使用DOMSAX(边读边解析)方式解析
Properties存储平面信息,使用Properties类解析

常见的XML解析器实现:JDOM、DOM4J(首选)、SAX

XPath:XML路径语言,用来确定XML文档中某部分位置

Web服务器

Tomcat(Apache)、JBOSS(Redhat)、WebLogic(Oracle)、WebSphere(IBM)等等

JavaWeb三大组件

  • Servlet
  • Filter
  • Listener

Servlet

Servlet是多线程、单实例。
继承关系:MyServlet –extends–> HttpServlet –extends–> QenericServlet –implements–> Servlet、ServletConfig

Servlet生命周期

  1. 初始化:服务器在Servlet第一次被访问时或在服务器启动时创建Servlet。创建后,调用init()方法;
  2. 提供服务:当服务器每次接收到请求时,会调用service()方法处理请求;
  3. 销毁:当服务器关闭时,服务器会去销毁Servlet。销毁前会调用destroy()方法。

在web.xml中配置

...
<servlet>
	<servlet-name>myServlet</servlet-name>
	<servlet-class>com.ianeiu.web.MyServlet</servlet-class>
	<!-- 通过ServletConfig获取 -->
	<init-param>
		<param-name>key</param-name>
		<param-value>value</param-value>
	</init-param>
	<!-- 值越小,优先级越大 -->
	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>myServlet</servlet-name>
	<url-pattren>/my/*</url-pattren>
</servlet-mapping>
...

访问路径可以使用通配符 * /* /myName/* *.do

HttpServlet

实现了service(..,..),重写service(HttpServletRequest ..,HttpServletResponse …),子类只需调用doGet() doPost()。

请求request

URL相关:
http://127.0.0.1:8080/myproject/myServlet?name=admin
.getRequestURL()+"?"+ .getQueryString
或者
.getScheme() +"://"+ .getServerName() +":"+.getServerPort() +"/"+ .getContextPath +"/"+ .getServerPath +"?"+ .getQueryString
/myproject/myServlet 可用 .getRequestURI() 获取

get和post

get:没有请求体,参数在url中显示,长度理论限制1K之内
post: 参数在请求体中,长度无限制

请求转发和请求包含

都是一个请求跨多个Servlet(可以共享request的域属性)

class AServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispacter rd = request.getRequestDispacter("/BServlet");
		rd.forward(request,response);//A不能输响应体,可设置响应头,最后由B处理
		rd.include(request,response);//无限制,共同处理请求
	}
}

响应response

可设置响应信息、发送状态码、设置响应正文、重定向(response.sendRedirect("/myProject/BServlet"))

响应编码

  1. response.setCharacterEncoding(“utf-8”); response.getWriter("..");
  2. response.setHeader(“content-type”,“text/html;charset=utf-8”);
  3. response.setContentType(“text/html;charset=utf-8”);

请求转发和重定向(302)

  1. 请求转发是一个请求,但是重定向是两个请求。
  2. 请求转发只能是一种请求方式,要么是Get要么是Post ,但是重定向的第二个请求一定是Get。
  3. 请求转发的地址栏并不会发生变化(服务器请求资源),但是重定向的会变化,因为它是两个请求(浏览器重新请求地址)。
  4. 请求转发只能在本应用下的资源,但是重定向却可以跨应用,比如重定向到百度的主页。

JavaWeb四大域对象

  • PageContext - page (jsp)
  • ServletRequest - request (servlet、jsp)
  • HttpSession - session (servlet、jsp)
  • ServletContext - application (servlet、jsp)

ServletContext

ServletContext是Servlet域三大对象之一。
在服务器启动时创建,关闭时销毁,单实例。
用来存取数据、读取web.xml中初始化参数、读取应用资源(文件名、输入流、文件路径集合)

响应头

防盗链:

  • Referer

禁用浏览器缓存:

  • Expies:-1
  • Cache-Control:no-cache
  • Pragma:no-cache

三秒后跳转至百度

  • <meta http-equiv="Refresh" content="3;url=http://www.baidu.com">

JSP九大内置对象

  • request - HttpServletRequest
  • response - HttpServletResponse
  • session - HttpSession
  • application - ServletContext
  • config - ServletConfig
  • exception - 只有在错误页面才可使用
  • page - 作用本JSP页面中
  • out - JSPWriter
  • pageContext - 页面上下文对象(作用域最小)

JSP中的Java脚本<%%>

  • 脚本
    • <% .. %> 脚本片段
    • <%= ..%> 表达式
    • <%! ..%> 声明,定义成员
    • 示例:<% int a=10; %> <%= a %> <%! private String hello="hello";%>
  • 注释
    • <%– .. –%>
  • 指令
    • <%@ .. %>

JSP原理

客户端 访问 index.jsp,服务器将jsp文件编译成java文件,JVM将java文件编译成class文件。
服务器初始化jsp实例,创建该类对象,调用service()。
客户端再次访问则直接调用service()。

JSP三大指令

  • page
  • 错误页面配置 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%>
  • 脚本获取错误 <%= exception.getMessage()%> [exception为jsp内置对象,error页面独有]
  • include
  • 静态包含
  • taglib
  • <%@ taglib uri="" prefix="c"%>

在web.xml中配置错误页面

<!-- 默认的错误处理页面 -->  
<error-page>  
	<error-code>403</error-code>  
	<location>/403.html</location>  
</error-page>  
<error-page>  
	<error-code>404</error-code>  
	<location>/404.html</location>  
</error-page>  
<!-- 仅仅在调试的时候注视掉,在正式部署的时候不能注释 -->  
<!-- 这样配置也是可以的,表示发生500错误的时候,转到500.jsp页面处理。 -->  
<error-page>   
	<error-code>500</error-code>   
	<location>/500.html</location>   
</error-page>
<!-- 这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型(当然包含子类)的异常就会转到500.jsp页面处理。 -->  
<error-page>   
	<exception-type>java.lang.Exception</exception-type>   
	<location>/500.jsp</location>   
</error-page>   
  
<error-page>   
	<exception-type>java.lang.Throwable</exception-type>   
	<location>/500.jsp</location>   
</error-page>  
<!--   
当error-code和exception-type都配置时,exception-type配置的页面优先级高  
及出现500错误,发生异常Exception时会跳转到500.jsp  
 -->   

在web.xml中配置jstl

...  
<jsp-config>  
   <taglib>  
	   <taglib-uri>myjstl</taglib-uri>  
	   <taglib-location>/WEB-INF/tld/c.tld</taglib-location>  
   </taglib>  
</jsp-config>  
...  

JSP基本动作

  • include
  • useBean
  • setProperty
  • getProperty
  • forward
  • plugin

动态包含和静态包含

  • 动态包含
  • <jsp:include page="navigation.jsp"/>
  • 请求处理阶段执行
  • 会检查所含文件变化,用于动态页面
  • 静态包含
  • <%@ include file="resource.html"%>
  • 翻译阶段执行(合并再编译)
  • 不检查所含文件变化,用于静态页面

Cookie是Http协议的规范之一,是服务端和客户端之间传输的小数据。 特点:

  1. 大小4KB(实际上不止)
  2. 服务器最多在客户端浏览器上保存20个
  3. 浏览器最多保存300个

HttpSession

用来会话跟踪的类。session是服务端对象,保存在服务端。
HttpSession底层依赖Cookie或是URL重写。

会话的实现依赖于容器,大多数容器采用基于Cookie的实现机制,使用名字为JSESSIONID的cookie作为session的唯一标识。

URL重写

  • <a href ="/myproject/myjsp.jsp;jsessionid=<%=session.getId()%>">跳转</a>
  • <a href ="<response.encodeURL('/myproject/myjsp.jsp')>">跳转</a>

EL表达式

EL表达式主要是用来替代JSP页面中的脚本表达式,获取JavaBean、Map、List、数组及域内置对象属性。也可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算。

语法:${标识符}

  • 获取数据
  • List/数组 ${userList[0]}
  • Bean ${user.userName}${user['userName']}
  • Map ${paramMap.key}${paramMap['key']}
  • 内置对象 ${sessionScope.userName}${initParam['maxNum']}
  • 如果Map的键或Bean的属性名中包含_-时,只有${initParam[‘max_num’]}
  • 运算
  • ${1+2}
  • ${3>5}${3 gt 5}
  • ${isSuccess && length>0}${isSuccess and length>0}
  • ${!isSuccess}${not isSuccess}
  • empty判断字符串、数组、集合的长度是否为0(可与not或!连用) ${empty ""}

EL 11个内置对象

  • pageScope:获取pageContext域属性,相当于pageContext.getAttribute(“xxx”)
  • requestScope:获取request域属性,相当于request.getAttribute(“xxx”)
  • sessionScope:获取session域属性,相当于session.getAttribute(“xxx”)
  • applicationScope:获取application域属性,相当于application.getAttribute(“xxx”)
  • param:对应参数,它是一个Map,其中key是参数,value是参数值,适用于单值的参数,相当于request.getParameter(“xxx”)
  • paramValues:对应参数,她是一个Map,其中key是参数,value是多个参数值,适用于多值的参数,相当于request.getParameterValues(“xxx”)
  • header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值的请求头,相当于request.getHeader(“xxx”)
  • headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值的请求头,相当于request.getHeaders(“xxx”)
  • initParam:获取web.xml中内的参数,${ initParam.xxx},xxx就是标签内的值,进而得到中的值
  • cookie:用于获取cookie,Map<String,Cookie>,其中key是cookie的name,value是cookie对象,例如${cookie.JSESSIONID.value }就是获取sessionId
  • pageContext:可以获取JSP九大内置对象,相当于使用该对象调用getxxx()方法,例如pageContext.getRequest()可以写为${pageContext.request)

JSTL

JSTL是一个不断完善的开放源代码的JSP标签库,依赖于EL,使用需要导入jstl.jar。

JSTL标签库可分为四种:

  1. core
  2. fmt
  3. sql
  4. xml

其中sql标签库和xml标签库已过时。使用标签的JSP页面中使用taglib指令导入标签库,如下:
<%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %>

  • prefix="c":指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
  • uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;

core标签库常用标签

  • out
  • <c:out value="aaa"/> 输出aaa字符串常量
  • <c:out value="${aaa}"/> 与${aaa}相同
  • <c:out value="${aaa}" default="xxx"/>
  • set
  • <c:set var="a" value="hello"/> 在pageContext中添加name为a,value为hello的数据。
  • <c:set var="a" value="hello" scope="session"/> 在session中添加name为a,value为hello的数据。
  • remove
  • <c: remove var="a"/> 删除所有域中name为a的数据
  • <c:remove var="a" scope="page"/> 删除pageContext中name为a的数据
  • url
  • <c:url value="/"/> 输出上下文路径:/项目名/
  • <c:url value="/" var="a" scope="request"/> 把本该输出的结果赋给变量a。范围为request
  • <c:url value="/AServlet"/> 输出:/项目名/AServlet
  • <c:url value="/AServlet"> <c:param name="username" value="abc"/> <c:param name="password" value="123"/> 输出:/项目名/AServlet?username=abc&password=123。如果参数中包含中文,那么会自动使用URL编码!
  • if
  • <c:if test="条件">满足条件执行的JSP代码</c:if>
  • choose
  • <c:choose> <c:when test="条件">处理</c:when> <c:when test="条件">处理</c:when> <c:otherwise>处理</c:otherwise> </c:choose>
  • forEach
  • <c:forEach var="名字(i)" begin="开始数字(1)" end="结束数字(5)"> ${i} </c:forEach>
  • <c:forEach var="item" items="数组/集合"> ${item} </c:forEach>
  • :forTokens
  • <c:forTokens items="google,runoob,taobao" delims="," var="name"> <c:out value="${name}"/><p> </c:forTokens>

fmt标签库

<fmt:formatNumber value=”被格式化的数据”[type=”number|currency|percent”]

                                               [pattern=”pattern”]

                                               [currencyCode=”code”]

                                               [currencySymbol=”symbol”]

                                               [groupingUsed=”true|false”]

                                               [maxIntergerDigits=”maxDigits”]

                                               [minIntergerDigits=”minDigits”]

                                               [maxFractionDigits=”maxDigits”]

                                               [minFractionDigits=”minDigits”]

                                               [var=”name”]

                                               [scope=page|request|session|application]

/>

详见 fmt

JSTL自定义标签

JSP中使用自定义标签移除只需要完成以下两个步骤:

  1. 编写一个实现Tag接口的java类(标签处理类);
  2. 编写标签库描述符(tld)文件,在tld文件中对标签处理类进行描述。

详见 JSTL自定义标签

JDBC

JDBC核心类:

  • DriverManager
  • 注册驱动
  • 获取Connection
  • Connection
  • 与数据库通讯
  • 获取Statement
  • Statement
  • 向数据库发送SQL语句
  • ResultSet
  • 结果集

JDBC编写顺序:

  1. 注册驱动层序
  2. 获取数据库连接
  3. 创建Statement/PreparedStatement
  4. 发送执行sql语句
  5. 处理结果集(如果有)
  6. 释放资源

Statement

con.createStatement()(结果集不滚动、不敏感、不可更新)
con.createStatement(int,int)

JDBC之Statement,PreparedStatement,CallableStatement

  1. Statement、PreparedStatement和CallableStatement都是接口(interface)。
  2. Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
  3. Statement接口提供了执行语句和获取结果的基本方法;
    PreparedStatement接口添加了处理 IN 参数的方法;
    CallableStatement接口添加了处理 OUT 参数的方法。
  4. 特性
  • Statement
    • 普通的不带参的查询SQL;
    • 支持批量更新,批量删除;
    • Statement每次执行sql语句,数据库都要执行sql语句的编译;用于仅执行一次查询并返回结果的情形时,效率高于PreparedStatement。
  • PreparedStatement
    • 可变参数的SQL,编译一次,执行多次,效率高;安全性好,有效防止Sql注入等问题
    • 支持批量更新,批量删除;
  • CallableStatement
    • 继承自PreparedStatement,支持带参数的SQL操作;
    • 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;

使用PreparedStatement有几个好处

  1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
  2. 安全性好,有效防止Sql注入等问题。
  3. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
  4. 代码的可读性和可维护性。

execute…

executeQuery:返回结果集(ResultSet)。
executeUpdate: 执行给定SQL语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的SQL语句(如 SQL DDL 语句)。
execute: 可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。

事务

事务的四大特性及隔离级别

数据库连接池

DBCP(hibernate3不再支持)

C3P0

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus