Servlet详解
1.实现servlet除了直接实现servlet接口以外还可以继承GenenricServlet或HttpServlet类,一般都使用HttpServlet类
2.HttpServlet是继承GenericServlet的基础上进一步的扩展,其子类必须实现一个方法,一般实现doGet请求或者doPost请求
3.在url-pattern配置规则:精确匹配 /具体路径
后缀匹配 星号.xxx
通配符匹配 /星号
通配符匹配 / /和/星号的区别为/不包括.jsp
4.load-on-startup 标记是否应该在web应用程序启动的时候就加载这个servlet,其数值必须为整数,表示servlet被加载的顺序,如果是负数或者是没有设置,当servlet被请求时再加载,值为正整数或者0时,在启动时加载并初始化这个servlet,值越小,servlet优先级越高,越先被加载,相同时会容器自己选择顺序来加载
5.注解:使用注解可以不适用xml配置,直接@WebServlet("/路径名"),注解有多个属性但一般只配置路径,其中urlPatterns和value作用一样,都是配置路径,不能同时使用,loadOnStartup注解是设置加载优先级的和上面第四个作用一样
6.requset对象:用来处理客户端请求,所有客户端请求的相关的数据,get,post,delete,cookie,header,seeion等都在request中
7.get和post区别
get请求:get提交的数据会放在URL之后,以?分割URL传输数据,参数之间以&相连,
get明文传递,数据量小,不安全,效率高,浏览器的默认请求方式为GET请求,对应的Servlet的方法为doGet
post请求:post方法是把提交的数据放在HTTP包的Body中密文传递数据,数据量大,安全
效率相对,没有GET高,对应的Servlet的方法是doPost
8.request主要方法
String getParameter(String name) 根据表单组件名称获取提交数据
void setCharacterEncoding(String charset) 指定每个请求的编码
9.设置返回类型和编码格式:resp.setContentType(“text/html;charset=UTF-8”);
10.设置请求参数的编码格式–对GET无效req.setChracterEncoding(“utf-8”);
11.产生乱码的原因是服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收
12.Tomcat8版本中get请求不再出现乱码,服务器对url的编码格式进行自动转换
13.response主要方法:setHeader设置响应信息头
setContenType(String)设置响应文件类型,响应式的编码格式
setCharacterEncoding(String)设置服务器端响应内容编码格式
getWriter获取字符输出流
14.response应用Servlet加JDBC(德鲁伊连接池)
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
DBUtils中的核心对象:
QueryRunner,替换了原生jdbc中的语句平台(Statement 以及 PreparedStatement),支持?绑定参数,可以有效的防止sql注入。
ResultSetHandler,这个接口是专门用来封装查询结果集的!提供了八大结果集实现类,可以保证不管是单行单列、多行多列、单列多行、单行多列都有对应的结果集
DBUtils连接数据库:
package com.qf.servletProject.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DbUtils {
//先定义一个德鲁伊数据源对象
private static DruidDataSource ds;
//定义一个ThreadLocal静态的不可改变的对象
private static final ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<>();
static {
//创建一个工具类对象
Properties properties = new Properties();
//利用DbUtils调用.class再调用getResourceAsStream方法读取工具文件中储存的连接数据库的信息,读取到的为字节码文件
InputStream inputStream = DbUtils.class.getResourceAsStream("/database.properties");
try {
//将上面读取的字节码文件进行转码
properties.load(inputStream);
//使用DruidDataSourceFactory方法通过我们读取到的文件创建一个和数据库的连接并返回给ds对象
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection connection = THREAD_LOCAL.get();
try {
if (connection == null) {
connection = ds.getConnection();
THREAD_LOCAL.set(connection);
}
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void begin() {
Connection connection = null;
try {
connection = getConnection();
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit() {
Connection connection = null;
try {
connection = getConnection();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(connection, null, null);
}
}
public static void rollback() {
Connection connection = null;
try {
connection = getConnection();
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(connection, null, null);
}
}
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
THREAD_LOCAL.remove();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
15.Servlet中页面的跳转分为两种形式
转发:在调用业务逻辑的Servlet中编写request.getRequestDispatcher