Java Web 基础

JSP
1 了解JSP页面
2 指令标识
JSP指令标识的语法格式如下:

<%@ 指令名 属性1=“属性1” 属性2=“属性值2” ...%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

指令名称在JSP中包含page include和taglib。在一条指令中可设置多个属性,各属性使用逗号或空格分隔。

2.1 page指令
Page指令用于定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Servlet时会装换为相应的Java程序代码。Page指令包含属性有15个:
1 language属性

#当前固定值和默认值都为java
<%@ page language="java" %>

2 extends 属性
3 import 属性
导入类包:

<%@ page import="java.util.*" %>

4 pageEncoding 属性
定义JSP页面的编码格式:

<%@ page pageEncoding="UTF-8"%>

5 contentType 属性
该属性用于设置JSP页面的MIME类型和字符编码,流浪器会据此显示网页内容:

<%@ page contentType="text/html; charset=UTF-8" %>

6 session 属性
该属性指定JSP页面是否使用HTTP的session会话对象。属性值是boolean类型,默认值为true。

<%@ page session="false" %>

7 buffer 属性
该属性用于设置JSP的out输出对象使用的缓冲区,大小,默认为8KB,且单位只能使用KB。(out对象是JSP的内置对象之一)
8 autoFlush 顺序
该属性用于设置JSP页面缓存满时,是否自动刷新缓存。默认值为true。如果设置为false,则缓存被填满时将抛出异常。
9 isErrorPage属性
改过该属性可以将当前JSP页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理。
10 errorPage属性
该属性用于指定处理当前JSP页面异常错误的另一个JSP页面,指定的JSP错误处理页面必须设置isErrorPage属性为true。errorPage属性的属性值是一个url字符串。

<%@ page errorPage="error/loginErrorPage.jsp" %>

注:如果设置该属性,那么在web.xml文件中定义的任何错误页面都将被忽略。

2.2 include指令

<%@ include file="path" %>

该指令只有一个file属性,可以是绝对或相对路径。

2.3 taglib指令
在JSP文件中,可以通过taglib指令标识声明该页面中所随用的标签库,同时引用标签库,并指定标签的前缀。

<%@ taglib prefix="tagPrefix" url="tagURI" %>

3 脚本标识
3.1 JSP表达式
JSP表达式用于向页面中输出信息

<%= 表达式 %>

3.2 声明标识
格式:

<%! 声明变量或方法的代码 %>

服务器执行JSP页面时,会将JSP也爱你装换为Servlet类,在该类中会把使用JSP声明标识定义的变量和方法转换为类的成员变量和方法。

<%!
int number = 0;
int cout() {
    number++;
    return number;
}
%>

3.3 代码片段
代码片段在页面请求的处理期间被执行。

<% Java代码 %>

由于代码片段是在请求处理期间被执行的,所有的它的生命期是仅页面的,但是声明标识是对应到Servelet的,所有生命周期是整个应用的。

4 JSP注释
4.1 HTML中的注释
4.2 带有JSP表达式的注释
单行注释,多行注释,提示文档注释(会被Javadoc文档工具读取到)
4.3 隐藏注释

<%-- 注释内容 --%>

4.4 动态注释

<!-- <%= new Date() %> -->

5 动作标识
5.1 包含文件标识

<jsp:include page="url" flush="false|true">
    子动作标识<jsp:param>
</jsp:include>

JSP的动作标识用于向当前页面中包含其他的文件。被包含的文件可以是动态文件,也可以是静态文件(自动判断动态或静态,独立编译,把结果插入)。
子动作标识用来向被包含的文件传递参数。
指令include和动作标识有很大差别:
1)include指令通过file属性指定被包含的文件,并且file属性不支持任何表达式;动作标识通过page属性指定被包含的文件,并且page属性支持JSP表达式。
2) 使用include指令时,被包含的文件内容会原封不动地插入到包含页中,然后JSP编译器再将合并后的文件最终编译成一个Java文件;使用动作标识包含文件时,当该标识被执行时,程序会将请求转发(不是重定向)到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码
3)在应用include指令包含文件时,由于被包含的文件最终会生成一个文件,所以在被包含文件,包含文件不能有重名的变量或方法;而在引用动作标识包含文件时,由于每个文件是单独编译的,所以在被包含文件和包含文件中重名的变量和方法是不冲突的。

5.2 请求转发标识
通过动作标识可以将请求转发到其他的Web资源。执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面。

<jsp:forward page="url" />
<jsp:forward page="url">
    子动作标识<jsp:param>
</jsp:forward>

5.3 传递参数标识
JSP的动作标识可以作为其他标识的子标识,用于为其他标识传递参数。格式:

<jsp:param name="参数名“ value="参数值" />

例子:

<jsp:forward page="modify.jsp">
    <jsp:param name="userId" value="7" />
</jsp:forward>

通过动作标识指定的参数,以键值对的形式加入到请求中。它的功能与在文件名后面加?参数名=参数值是相同的。

JSP内置对象

1 JSP内置对象
JSP中一共预定义了9个内置对象:request、response、session、application、out、pageContext、config、page和exception

2 request对象
2.1 访问请求参数

// 参数不存在,返回null
request.getParameter("id");

2.2 在作用域中管理属性
在进行请求转发时,需要把一些数据传递到转发后的页面进行处理。这时,就需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中。

request.setAttribute(String name, Object object)

在将数据保存到request范围内的变量中后,可以通过request对象的getAttribute()方法获取该变量的值:

request.getAttribute(String name);

注意:由于getAttribute()方法的返回值为Object类型,所以需要调用其toString()方法,将其转换为字符串类型(如果设置的是字符串)。

2.3 获取cookie
通过cookie的getCookies()方法可以获取所有cookie对象的集合;通过cookie对象的getName()方法可以获取到指定名称的cookie;通过getValue()方法可获取到cookie对象的值;将一个cookie对象发送到客户端,使用response对象的addCookie()方法。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>   
<%@ page import="java.net.URLDecoder" %> 

<% 
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (int i = 0; i < cookies.length; i++) {
        out.println(cookies[i].getName() + " = " +  URLDecoder.decode(cookies[i].getValue()));
    }
}

String cookieValue = URLEncoder.encode("饼干");
Cookie cookie = new Cookie("ifeeline", cookieValue);
cookie.setMaxAge(3600);
response.addCookie(cookie);
%>

在向cookie中保存的信息中,如果包括中文,需要调用java.net.URLEncode类的encode()方法将值进行编码,在取时需要用java.net.URLDecoder类的decode()方法进行解码。
2.4 解决中文乱码
发送请求的参数值编码和服务端编码不一致。
2.5 获取客户端信息

br />传送数据的方法(GET POST)<%= request.getMethod() %>
<br />协议名称<%= request.getProtocol() %>
<br />请求地址(不包括请求参数)<%= request.getRequestURL() %>
<br />客户端IP<%= request.getRemoteAddr() %>
<br />获取服务器端口号<%= request.getServerPort() %>
<br />获取服务器名称<%= request.getServerName() %>
<br />获取客户端主机名<%= request.getRemoteHost() %>
<br /><%= request.getServletPath() %>
<br />请求头(host)<%= request.getHeader("host") %>			
<br />请求头(user-agent)<%= request.getHeader("user-agent") %>
<br />当前请求文件的绝对路径<%= request.getRealPath("index.jsp") %>

2.6 显示国际化信息
流浪器通过accept-language的HTTP报头向Web服务器指明它所使用的本地语言。request对象中的getLocale()和getLocales()方法获取这部分信息。

<%
java.util.Locale locale = request.getLocale();
String str = "";
if (locale.equals(java.util.Locale.US)) {

}
if (locale.equals(java.util.Locale.CHINA)) {

}

3 response对象
3.1 重定向网页

response.sendRedirect(String path);

3.2 处理HTTP响应头
1)禁用缓存

response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);

2) 设置页面自动刷新

response.setHeader("refresh", "10");

3) 定时跳转网页

response.setHeader("refresh", "5;URL=login.jsp");

3.3 设置输出缓冲

flushBuffer() 强制将缓冲区输出到客户端
getBufferSize() 获取缓冲区大小
setBufferSize(int size) 设置缓冲区的大小
reset() 清除缓冲区的内容
isCommitted() 检测服务端是否已经把数据写入到客户端

4 session对象
4.1 创建及获取客户的会话

session.setAttribute(String name, Object obj)
session.getAttribute(String name);

注:getAttribute()方法返回值是Object类型。如果需要赋值给String变量,需要调用toString()方法(或强制类型转换)。

4.2 从会话中移动指定的绑定对象

removeAttribute(String name)

4.3 销毁session

session.invalidate()

销毁session后,将不可以再使用该sessiond对象。如果再调用session对象的任何方法,抛Session already invalidated异常。

4.4 会话超时的管理

session.getLastAccessedTime()
session.getMaxInactiveInterval() 两个请求允许的最大时间间隔(有效时长)
session.setMaxInactiveInterval() 设置时长

4.5 session对象的应用

5 application对象
5.1 访问应用程序初始化参数
在web.xml中通过标记配置应用程序初始化参数。

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://127.0.0.1:3306/test</param-value>
</context-param>

提供了两种访问应用程序初始化参数的方法:

application.getInitParameter(String name)
application.getAttributeNames() // 返回所有

实例:

<%@ page import="java.util.*" %>
<%
Enumeration enema = application.getInitParameterNames();
while (enema.hasMoreElements() ) {
    String name = (String)enema.nextElement();
    String value = application.getInitParameter(anme);
}
%>

5.2 管理应用程序环境属性

getAttributeNames()
getAttribute(String name);
setAttribute(String name, Object obj)
removeAttribute(String name)

6 out对象
6.1 向客户端输出数据
6.2 管理响应缓冲

clear() 清除缓冲区的内容(如响应已提交,产生IOException异常)
clearBuffer() 清除当前缓冲区中的内容
flush() 
isAutoFlush()
getBufferSize()

7 其它内置对象
7.1 获取会话范围的pageContent对象

forward(java.lang.String relativeUrlpath)

7.2 读取web.xml配置信息的config对象
主要用于取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。
7.3 应答或请求的page对象
page对象代表JSP本身,只有在JSP页面内才是合法的。page对象本质上是包含当前Servlet接口引用的变量,可以看作是this关键字的别名。
7.4 获取异常信息的exception对象
只有在page指令中设置为isErrorPage属性值为true的页面中才可以被使用。如果在JSP页面中出现没有捕捉到的异常,就会生成exception对象,并把exception对象传送到page指令中设定的错误页面中。

JavaBean
1 JavaBean介绍
2 JavaBean的应用
2.1 获取JavaBean属性信息
在JavaBean对象中,为了防止外部直接对JavaBean属性的调用,通常将JavaBean中的属性设置为私有,单需要为其提供公共的方法方法。

<jsp:useBean id="produce" class="com.ifeeline.bean.Product"></jsp:useBean>
<jsp:getProperty property="count" name="produce" />

实际是调用produce对象的getCount()方法。会自动实例化一个对象,所以Bean类型需要一个无参的构造函数。操作属性时需要提供getXxx方法。

2.2 对JavaBean属性赋值
如果对JavaBean对象的属性提供了setXxx方法,在JSP页面中可通过对其进行赋值。

2.3 在JSP页面中应用JavaBean
通过JSP动作标签 来实现对JavaBean对象的操作。将JavaBean对象应用到JSP页面中,JavaBean的生命周期可以自行进行设置,它存在于4种范围内:page,request,session和application。默认作用于page。
<
/jsp:useBean>

Servlet技术
1 基础
Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持。
1.1 Servlet结构体系
抽象类GenericServlet实现Servlet(javax.servlet)、ServletConfig(javax.servlet)、Serializable接口(java.io),HttpServlet继续GenericServlet。

1.2 Servlet技术特点

1.3 Servlet与JSP的区别

1.4 Servlet代码结构

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
    public void init() throws ServletException {}
    public void destroy() {
	super.destroy();
    }

}

2 Servlet API编程常用接口和类
3 Servlet开发
3.1 Servlet创建
3.2 Servlet配置
要使Servlet对象正常地运行,需要进行适当的配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置包含在web.xml文件中,通过如下两步设置:
1)声明Servlet对象

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.ifeeline.TestServlet</servlet-class>
</servlet>

2)映射Servlet

<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattem>/TestServlet</url-pattem>
</servlet-mapping>

Servlet过滤器与监听器
1 Servlet过滤器
1.1 过滤器
1.2 过滤器核心对象
过滤器对象放置在javax.servlet包中,名称为Filter,相关的有FilterConfig和FilterChain。
1.3 过滤器创建与配置
1.4 字符编码过滤器

2 Servlet监听器
2.1 Servlet监听器
2.2 Servlet监听器的原理
2.3 Servlet上下文监听
2.4 HTTP会话监听
2.5 Servlet请求监听

3 Servlet3.0 新特征

Java Web数据库操作
1 JDBC
1.1 JDBC
1.2 JDBC链接数据库的过程
下载驱动https://dev.mysql.com/downloads/connector/j/,得到mysql-connector-java-5.1.45-bin.jar,放入WEB-INF/lib中,重启应用:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
try {
	Class.forName("com.mysql.jdbc.Driver");
	String url = "jdbc:mysql://localhost:3306/test";
	String username = "root";
	String password = "root";
	
	Connection conn = DriverManager.getConnection(url, username, password);
	if (conn != null) {
		out.println("数据库链接成功");
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT * FROM tst");
		while (rs.next()) {
			out.println(rs.getInt("id"));
		}

                PreparedStatement ps = conn.prepareStatement("INSERT INTO tst (name, price) values(?, ?)");
		ps.setString(1, "xxxxxx");
		ps.setDouble(2, 2.22);
		int row = ps.executeUpdate();
		ps.close();

		rs.close();
		stmt.close();
		conn.close();
	} else {
		out.println("数据库链接失败");
	}
} catch (ClassNotFoundException e) {
	e.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
}
%>

2 JDBC API
2.1 Connection接口
Connection接口位于java.sql包中。

void close() throws SQLException
void commit() throws SQLException
Statement createStatement() throws SQLException
boolean getAutoCommit() throws SQLException
DatabaseMetaData getMetaData() throws SQLException
int getTransactionIsolation() throws SQLException
boolean isClosed() throws SQLException
boolean isReadOnly() throws SQLException
PreparedStatement PreparedStatement(String sql) throws SQLException
void releaseSavepoint(Savepoint savepoint) throws SQLException
void rollback() throws SQLException
void rollback(Savepoint savepoint) throws SQLException
void setAutoCommit(boolean autoCommit) throws SQLException
void setReadOny(boolean readOnly) throws SQLException
Savepoint setSavepoint() throws SQLException
void setSavepoint(String name) throws SQLException
void setTransactionIsolation(int level) throws SQLException

2.2 DriverManager类

public static Connection getConnection(String url) throws SQLException
void commit() throws SQLException

2.3 Statement接口

void close() throws SQLException
boolean execute(String sql) throws SQLException(执行指定的SQL语句)
ResultSet executeQuery(String sql) throws SQLException(执行查询)
int executeUpdate(String sql) throws SQLException(insert update delete, 返回影响的行数)
boolean isClosed() throws SQLException

2.4 PreparedStatement接口
PreparedStatement接口继承于Statement接口。

2.5 ResultSet接口

EL(表达式语言)
1 EL
1.1 EL的基本语法
${expression}
1.2 EL的特点
EL中会自动进行类型装换
EL不仅可访问一般变量,还可访问JavaBean中的属性已经嵌套属性和集合对象

2 禁用EL
3 保留的关键字
4 EL的运算符及优先级
4.1 通过EL访问数据
通过EL提供的[]和.运算符可以访问数据。[]和.运算符等价。
4.2 EL中的算术运算
4.3 EL中判断对象是否为空
${empty expression}
${not empty expression}
4.4 在EL中进行逻辑关系运算
4.5 在EL中进行条件运算

5 EL的隐含对象
5.1 页面上下文对象
页面上下文对象为pageContext,用于访问JSP内置对象(如request,response,out,session,exception和page等,但不能用于获取application,config和pageContext对象)和servletContext。

6 定义和使用EL函数


JSTL标签