2020-09-22

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值