JavaWeb笔记整理
XML
XML(EXtensible Markup Language):可扩展标记型语言,主要是为了存储数据(程序配置文件)、数据交换
格式:<?xml version="1.0" encoding="utf-8"?>
XML两种文档约束类型: dtd
(file_name.dtd)和schema
(file_name.xsd 可被XML解析器解析)
XML存储结构化信息,使用DOM
或SAX
(边读边解析)方式解析
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生命周期
- 初始化:服务器在Servlet第一次被访问时或在服务器启动时创建Servlet。创建后,调用init()方法;
- 提供服务:当服务器每次接收到请求时,会调用service()方法处理请求;
- 销毁:当服务器关闭时,服务器会去销毁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"))
响应编码
- response.setCharacterEncoding(“utf-8”); response.getWriter("..");
- response.setHeader(“content-type”,“text/html;charset=utf-8”);
- response.setContentType(“text/html;charset=utf-8”);
请求转发和重定向(302)
- 请求转发是一个请求,但是重定向是两个请求。
- 请求转发只能是一种请求方式,要么是Get要么是Post ,但是重定向的第二个请求一定是Get。
- 请求转发的地址栏并不会发生变化(服务器请求资源),但是重定向的会变化,因为它是两个请求(浏览器重新请求地址)。
- 请求转发只能在本应用下的资源,但是重定向却可以跨应用,比如重定向到百度的主页。
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
Cookie是Http协议的规范之一,是服务端和客户端之间传输的小数据。 特点:
- 大小4KB(实际上不止)
- 服务器最多在客户端浏览器上保存20个
- 浏览器最多保存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标签库可分为四种:
- core
- fmt
- sql
- 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中使用自定义标签移除只需要完成以下两个步骤:
- 编写一个实现Tag接口的java类(标签处理类);
- 编写标签库描述符(tld)文件,在tld文件中对标签处理类进行描述。
详见 JSTL自定义标签
JDBC
JDBC核心类:
- DriverManager
- 注册驱动
- 获取Connection
- Connection
- 与数据库通讯
- 获取Statement
- Statement
- 向数据库发送SQL语句
- ResultSet
- 结果集
JDBC编写顺序:
- 注册驱动层序
- 获取数据库连接
- 创建Statement/PreparedStatement
- 发送执行sql语句
- 处理结果集(如果有)
- 释放资源
Statement
con.createStatement()(结果集不滚动、不敏感、不可更新)
con.createStatement(int,int)
JDBC之Statement,PreparedStatement,CallableStatement
- Statement、PreparedStatement和CallableStatement都是接口(interface)。
- Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
- Statement接口提供了执行语句和获取结果的基本方法;
PreparedStatement接口添加了处理 IN 参数的方法;
CallableStatement接口添加了处理 OUT 参数的方法。 - 特性
- Statement
- 普通的不带参的查询SQL;
- 支持批量更新,批量删除;
- Statement每次执行sql语句,数据库都要执行sql语句的编译;用于仅执行一次查询并返回结果的情形时,效率高于PreparedStatement。
- PreparedStatement
- 可变参数的SQL,编译一次,执行多次,效率高;安全性好,有效防止Sql注入等问题
- 支持批量更新,批量删除;
- CallableStatement
- 继承自PreparedStatement,支持带参数的SQL操作;
- 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
使用PreparedStatement有几个好处
- 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
- 安全性好,有效防止Sql注入等问题。
- 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
- 代码的可读性和可维护性。
execute…
executeQuery:返回结果集(ResultSet)。
executeUpdate: 执行给定SQL语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的SQL语句(如 SQL DDL 语句)。
execute: 可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。
事务
事务的四大特性及隔离级别
数据库连接池
DBCP(hibernate3不再支持)
C3P0