事务,jdbc,javaweb三层架构,servlet、JSON(firstjson)

事务

事务的四大特性:

  1. ACID原子性:只的是同一个事务中的所有操作不可分割原子性是通过mysql中的一种日志
    undolog来实现的,在事务的操作过程中undolog日志记录了从事务的
    最开始位置到回滚的时候所做的所有操作,在接收回滚指令时mysql只需要读取日志的内容并且进行反向操作即可将数据恢复到事务开始时候的状态
  2. 一致性:事务执行的前后,数据应该从一种一致状态切换到另一种一致状态1000+1000 1800+200 1000+1000
    一致性是事务控制的最终目的
  3. 隔离性:一个事务在执行的过程中不应该受到另一个事务的影响持久性:一个事务提交后对表中的数据的修改应该永久的保存起来
  4. 持久性:时通过mysql中另一种日志 redolog进行实现的一致性是目的,其他三个特性是保证一致性的手段

事务隔离性

  1. 读未提交表示一个事务可以读取到另一个事务未提交的数据,这种现象称为“脏读”
  2. 读已提交(read committed):一个事务只能读取到另一个事务已经提交的数据,解决了脏读的问题,但是它自己又带来了新的问题,在同一个事务中出现了两次读取同一条数据的结果不一致,这种现象称为“不可重复读”
  3. 可重复读(repeatable read默认的):在一个事务中可以实现对同一个数据的重复读取,结果是一致的,但是这种级别会出现“幻读”现象
  4. 串行化(serializable):所有的事务依次串行执行,任何一个时刻只允许一个事务操作某张表,实际的应用中不会选择这种方式,因为多个事务的并发效率太低

jdbc

//第一步:通过反射加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:通过DriverManager类的静态方法获取一个指向某个数据库的连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");
//第三步:准备sql语句
//第四步:获取一个命令语句对象
connection.createStatement();
connection.prepareStatement();
//第五步:调用statement或者prepareStatement对象的execute方法执行sql语句并获取执行的结果,结果为指向结果的指针,通过next方法指向结果集
//第六步:关闭资源

Statement接口和PreparedStatement使用的两个区别:

  1. Statement接口在创建的时候无需执行具体的sql语句,sql命令的指定是在调用execute方法执行的时候,但是PreparedStatement接口在创建时就需要立马指定将来要执行的sql语句
  2. 对于参数的处理方式不一样,statement接口只能通过字符串拼接的方式,而PreparedStatement采用编写sql时通过?进行参数的占位,在真正执行之前调用它的setXXX(index,参数值)方法进行参数值的确定

结论:开发中我们一定是使用预编译的Statement对象,除此之外PreparedStatement性能更高

javaweb三层架构

  1. 界面层 UI层(User Interface)
  2. 业务逻辑层(BLL)
  3. 数据访问层(DAL)

servlet

常用方法

//写cookie,创建一个Cookie对象
Cookie cookie = new Cookie("名字","内容");
//保存状态信息
response.addCookie(cookie)
//读取cookie,从请求中获取所有的cookie返回一个数组
Cookie[] cookies = request.getCookies();
元素.getName()获得cookie信息


//获取session
HttpSession session = request.getSession();
//向session中存放状态数据
session.setAttribute("username",username);
//从session中获取状态数据
session.getAttribute("username")


常用方法:
在servlet中
response.setHeader("Content-Type","text/html;charset=utf-8");
设置响应的字符编码格式

request.setCharacterEncoding("utf-8");
设置请求的字符编码格式

request.getParameter("username")
返回值为String,获取表格name为username的值

response.getWeiter().write(html)
往网页中写入HTML代码

response.sendRedirect("/web02/stu_list");
重定向访问

request.getRequestDispatcher("路径").forward(request,response);
转发访问

accetp()获取客户端链接,阻塞方法

confirm("确定是否删除?")确认框

e.preventDefault();通过此方法阻止事件的发生


两种状态管理技术

1. cookie

cookie的机制:将状态信息(指的是某一次请求处理后的结果)以cookie的形式保存在客户端

//写cookie
Cookie cookie = new Cookie("loginFlag","success"); //创建一个Cookie对象保存状态信息
response.addCookie(cookie);  //将cookie通过响应头的方式发送给客户端浏览器

//读取cookie
Cookie[] coolies = request.getCookies();  //从请求中获取所有的cookie返回一个数组
Cookie cookie = null;
if(cookies != null){
	for(Cookie c : coolies){
		if(c.getName().equals("loginFlag")){
			coolie = c;
			break;
		}
	}
} ///从所有的cookie中找到名称为longinFlag的cookie

2. session

session从本质上来说就一块服务器内存,但是这块内存需要通过sessionid建立和每个客户端浏览器的关联

//获取session
HttpSession session = request.getSession();
//向session中存放状态数据
session.setAttribute("username",username);
//从session中获取状态数据
session.getAttrbute("username");

详解

  1. session从本质上来说就是一块服务器内存空间,该空间是用来保存每个客户某一次请求处理后的状态结果
  2. session是和每个客户对应的,每个客户端浏览器都持有一个唯一的sessionid,服务器就是根据每个客户端请求中发送过来sessionid来识别客户的身份
  3. session对应的内存在客户端第一次获取session会话数据的时候创建
  4. session的内部设计一个Map结构的集合
  5. session默认30分钟失效,在tomcat的全局配置文件web.xml中进行了session失效的默认时间配置
    在这里插入图片描述

这个超时时间不是绝对的30分钟,它是一个滑动过期时间

经典面试题:谈谈cookie和session的区别

  • cookie是将数据保存在客户端 session是将数据保存在服务器
  • cookie只能保存少量的文本信息,但是session的数据是保存在服务器内存中运行在JAVA环境中,因此在session中可以保存任何类型的数据(value被设计为Object类型)

几个域对象

Request Session ServletContext
所谓的域对象就是可以用来在服务器上保存数据的容器,他们具有相同的方法:
setAttribute(String key,Object value) getAttribute(String key)
request对象设置的值只能在同一次请求中有效,只要这一次请求结束立马销毁
注意:request对象的两个获取数据的方法区别

  • getParameter(String name):只能用来获取客户端浏览器发送过来的数据
  • getAttribute(String name):只能用来获取服务器上调用setAttribute()设置的数据

session对象存储的数据在整个的会话期间都是有效的,而且每个客户端浏览器都对应有一个session

ServletContext对象对于整个工程全局只有一份,在tomcat容器启动的时候自动创建,在tomcat容器关闭的时候销毁

JSON

//针对单个对象的转换
//        Person p1=new Person(1,"张三",18);
//      //1.将对象转成JSON
        String json = JSON.toJSONString(p1);
        System.out.println(json);
        //2.将JSON字符串转成JAVA对象
        String str="{\"age\":18,\"id\":1,\"name\":\"张三\"}";
        Person person = JSON.parseObject(str, Person.class);
        System.out.println(person);

        Person p1=new Person(1,"张三",18);
        Person p2=new Person(2,"李四",28);
        Person p3=new Person(3,"王五",38);
        List<Person> list= Arrays.asList(p1,p2,p3);
        //1.将JAVA集合转成JSON
        String json = JSON.toJSONString(list);
        System.out.println(json);
        //2.将JSON转换为一个Java对象集合
        String str="[{\"age\":18,\"id\":1,\"name\":\"张三\"},{\"age\":28,\"id\":2,\"name\":\"李四\"},{\"age\":38,\"id\":3,\"name\":\"王五\"}]";
        List<Person> person = JSON.parseObject(str, new TypeReference<List<Person>>() {});
        for (Person person1 : person) {
            System.out.println(person1);
        }

		//json解析对象的时候,最后一位对象中的对象解析未成功,且date数据解析为时间戳,以下是解决方法
        String json = JSON.toJSONStringWithDateFormat(data,"yyyy-MM-dd HH:mm:ss",SerializerFeature.DisableCircularReferenceDetect);
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值