回顾
1.Servlet API
2.HttpServlet
DoXXX处理哪种Http方法会调用到对应的方法
init/destroy/service—>servlet的生命周期
3.HttpServletRequest Http请求 get系列方法
协议名(版本号)
url
query string
header
query String/body
HttpServletResponse Http响应 set系列方法
状态码
各种header
body
正文
当前表白墙写了多个DataSourse,使用单例模式优化
饿汉:类加载创建实例
懒汉:效率更高(首次调用创建实例)
public class DBUtil {
private static DataSource dataSource=null;
public DataSource getDataSource(){
//首次调用的时候创建实例
if(dataSource==null){
dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:/mysql://127.0.0.1:3306/java105?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
//数据库的密码
((MysqlDataSource)dataSource).setPassword("1309411303");
}
return dataSource;
}
}
还要注意线程安全问题:
多个线程同时判定dataSouce为null,会创建多个实例
Servlet代码中,涉及到多线程/线程安全问题,
Servlet写的是一个服务器,同一时刻,可能要处理多个客户端的请求,一旦有多个客户端发送多个请求,服务器务必需要同时处理多个请求
Tomcat内部正式使用了多线程的方式
解决方案:
1.加上volatile
private static volatile DataSource dataSource=null;
2.加锁
3.构造方法私有
Cookie 和 Session
Cookie 是浏览器在本地持久化保存数据的一种方案
一个典型的使用方式,存储登录信息
在Servlet中也专门提供了相关的Api,让我们来操作Cookie和Session
理解会话机制
服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系
写一个模拟登录的案例:
1.登录页面,用户可以填写用户名+密码
2.Servlet来处理登录请求
3.使用另一个Servlet来生成主页内容(登录成功后,跳转到的页面)
1.构造form表单发给Servlet处理(注意三点匹配关系)
name(getParameter),method ,action
2.Servlet进行判定
当用户点击提交的时候,就会把刚才input框的name的值作为key,把input框里用户的输入,作为value,把这个键值对,放到body中提交给服务器,name属性决定了键值对中的建,通过服务器getParameter获取值
这里将字符串写到前面,肯定不是空的,一定不会出现空指针异常(好处double check),虽然equls内部已经针对参数为null进行从处理了