我的笔记

目录

视频一 概述和基本配置

基本概念

SpringMvc简介
  • SpringMvc是一种MVC框架
项目说明
  • xml是容器入口
  • DispatcherServlet类拦截器
  • 标签启动优先级
  • InternalResourceViewResolver 视图拦截器

实现功能

SpringMvc环境配置

web.xml

<servlet>
  	<servlet-name>springMVC</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>springMVC</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc" 
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/" />
      <property name="suffix" value=".jsp" />
   </bean>

视频二 helloworld示例

基本概念

Controller接口

注意:导入的是org.springframework.web.servlet.mvc.Controller下的Controller

ModelAndView 视图与数据类 handleRequset的返回类型

Controller如何找到相对于的jsp

通过配置spring-servlet.xml下的 bean 标签来进行配置路径

<bean name = "/test1/helloworld" class = "com.masssa.controller.HelloWorldController"/>

name 为用户访问的地址 class指向去处

实现功能

welcome页面的访问

HelloWorldController

public class HelloWorldController implements Controller
{

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception
	{
		System.out.println("---hello masssa---");
		return new ModelAndView("/welcome");
	}
	
}

​ 访问路径:http://localhost:8090/SpringMvc/test1/helloworld

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cUcvAwf-1582377370560)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200220194406035.png)]

访问成功页面

视频三 修改配置文件路径和给界面传递数据

基本概念

修改springmvc的配置路径

因为一个项目有很多配置不能把所有的配置放在一个配置文件下面,于是建一个专门放在各种配置文件的地方,并修改springmvc的默认查找路径

传递数据

原理:因为返回一个ModalAndView的对象,该对象包括一个Object类型的View用来存放视图和一个ModalMap的modal用来存放数据(Map映射方式传值)

在jsp页面通过jstl表达式取出映射的值

实现功能

配置springmvc路径

新建一个config包存放配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFc5iiEV-1582377370562)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221122139926.png)]

打开web.xml配置路径

<init-param>
  			<param-name>contextConfigLocation</param-name>
  			<param-value>classpath*:config/springMVC-servlet.xml</param-value>
</init-param>
向前端传递数据
Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("map1", "test1");
		map.put("map2", "test2");
		map.put("map3", "test3");
		
		
		return new ModelAndView("/welcome","map",map);
前端接受后台的数据
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
	<div>
    	<c:forEach items = "${map}" var="m">
    		123132132
    		${m.key} -----> ${m.value}
    	</c:forEach>
    </div>

视频四 一个Controller写多个方法

基本概念

MultiActionController

Spring提供了一个多动作控制器,用于支持在一个控制器里添加多种功能处理方法,即在一个控制器中存放多个功能处理方法。

实现功能

MultiActionController的配置

配置一个方法名称解析器

 <bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">    
</bean>

配置解析器的标准

<property name="paramName" value="action"></property>

给我们的controller配置解析器

    <bean name = "/test1/multi" class = "com.masssa.controller.MultiController" >
    	<property name = "methodNameResolver">
    		<ref bean = "paramMethodResolver"/>
    	</property> 
    </bean>

MultiController.java

public class MultiController extends MultiActionController
{
		public ModelAndView add(HttpServletRequest arg0, HttpServletResponse arg1){
			System.out.println("add");
			return new ModelAndView("/multi","method","add");
		}
		
		public ModelAndView update(HttpServletRequest arg0, HttpServletResponse arg1){
			System.out.println("update");
			return new ModelAndView("/multi","method","update");
		}
}

multi.jsp

  <body>
    <h>多方法Controller</h>
    本次方法是 ${method }
  </body>

因为解析器的标准设置的是action 故通过访问映射路径的后面加?method = xxx来调用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOc4FIzZ-1582377370564)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221140340031.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4MW4i3PB-1582377370565)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221140354660.png)]

视频五 SpringMVC静态文件访问

基本概念

静态文件

如 js , css, 图片 等

静态文件的访问

静态文件的访问也是一种请求,因为我们的拦截器拦截了所有的请求访问

mvc resources

配置静态文件标签,使其访问路径过滤掉

实现功能

jsp图片的显示

配置静态标签

 <mvc:resources location = "/img/" mapping="/img/**"/>

staticFile.jsp

  <body>
    <h>图片访问</h>
    	<img src="img/a.jpg"></img>
  </body>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjjAbG7v-1582377370566)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221143502400.png)]

jquery的使用

配置静态标签

<mvc:resources location = "/js/" mapping="/js/**"/>

jquery.jsp

  <script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
   <script type="text/javascript">
$(document).ready(function(){
alert("登录成功!");
})
</script

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5Nw86RK-1582377370566)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221143620860.png)]

视频六 注解访问

基本概念

springmvc配置

context:component-scan 开启包扫描,对指定的包进行注解扫描

AnnotationMethodHandlerAdapter 通过类找方法

DefaultAnnotationHandlerMapping通过url找类

controller注解

在类上加上@Controller 指定为Controller

@RequestMapping("/t请求名",post/get) 访问路径和配置方式

功能实现

通过注入的方法和不同的传值方式打开jquery

UserController.java

@Controller
public class UserController {
	
	@RequestMapping(value="/user/addUser",method=RequestMethod.POST)
	public ModelAndView addUser(){
		
		String result ="this is addUser------";
		return new ModelAndView("/jquery","result",result);
	}
	
	@RequestMapping(value="/user/delUser",method=RequestMethod.GET)
	public ModelAndView delUser(){
		String result ="this is delUser------";
		return new ModelAndView("/jquery","result",result);
	}
	@RequestMapping(value="/user/toUser",method=RequestMethod.GET)
	public ModelAndView toUser(){
		return new ModelAndView("/jquery");
	}
}

jquery.jsp

<body>
	<form action="/springMVC4/user/addUser" method="post">
	<h>springMVC注解1</h>
	<br/>
	<div>
		${result }
	</div>
		<input type="submit" value="post请求">
	</form>
</body>

视频七 注解优化

基本概念

注解优化

因为每次启用都要使用AnnotationMethodHandlerAdapter和DefaultAnnotationHandlerMapping 所以spring把他们封装起来用一句话代替

<mvn:annotation-driven/>
Controller类优化
  1. 在类上配置@RequestMapping("") 单个方法的配置就不用带上一个路径了
  2. 避免重复
  3. post和get方法都可以访问

功能实现

通过对Controller类设置@RequestMapping("")来访问页面

UserController.java

@Controller
@RequestMapping("user")
public class UserController {
	
	@RequestMapping("/addUser")
	public ModelAndView addUser(){
		
		String result ="this is addUser------";
		return new ModelAndView("/jquery","result",result);
	}
}
通过String和request进行页面访问与传值
@Controller
@RequestMapping("user")
public class UserController {
	
	@RequestMapping("/addUser")
	public String addUser(HttpServletRequest request){
		
		String result ="this is addUser------";
		request.setArribute("result",result);
		return "/jquery";
	}
}

视频八 参数传递

基本概念

通过form表单进行跳转

把值与名称一一对应进行传值,Controllor页面的req通过名字来获取值来进行下次传递

中文乱码
  1. 当传中文值过来时会乱码,因为默认是GBK格式 ,可以通过req.setCharacterEncoding(“UTF-8”)来解决乱码
  2. 通过Springmvc的配置来配置中文,配置图在功能实现中
  3. 设置Tomcat的传值格式,在conf/setting.xml中配置 改为UTF-8

功能实现

form传值跳转

jquery.jsp

<script type="text/javascript">
	function addUser(){
		var form = document.forms[0];
		form.action="/springMVC6/user/data/addUser";
		form.method="post";
		form.submit();
	}
</script>
</head>
<body>
	<h>添加用户</h>
	<form name="userForm" action="">
		姓名:<input type="text" name="userName">
		年龄:<input type="text" name="age">
		<input type="button" value="添加" οnclick="addUser()">
	</form>
</body>

DataController.java

@Controller
@RequestMapping("/user/data")
public class DataController {
	
	@RequestMapping("/addUser")
	public String addUser(User user,HttpServletRequest request){
		request.setAttribute("userName", user.getUserName());
		request.setAttribute("age", user.getAge());
		return "/userManager";
	}
}

userManager.jsp

<body>
	<h1>用户管理</h1>
	姓名:=====${userName }
	<br/>
	年龄:=====${age }
</body>
字符编码过滤器
<filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

视频九 和josn结合传递数据

基本概念

josn概念

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.例如

{age:"11"}
Bean

java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性,凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;

Ajax

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

本节课中通过ajax异步传递,已传递一个User bean

通过设置地址url 传递方式type 数据data来传递

其他

通过request.setAttribute(k, v);来进行下个页面的数据传递

功能实现

传递bean数据

Bean : User.java

public class User {
	
	private String userName;
	
	private String age;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
}

json.jsp

<script type="text/javascript">
	$(document).ready(function(){
		$("#add").click(function(){
			var userName = $("#userName").attr("value");
			var age =$("#age").attr("value");
			
			var user = {userName:userName,age:age};
			
			$.ajax({
				url:"/springMVC6/user/data/addUserJson",
				type:"post",
				data:user,
				success:function(a){
					alert("userName--->" + a.userName + "age--->" + a.age );
					
				}
			});	
		});
	});
</script>

Controller: DataController.java

@RequestMapping("/addUserJson")
	public void addUserJson(User user,HttpServletRequest request,HttpServletResponse response){
		String username = URLDecoder.decode(user,getUsername(),"UTF-8");
		String age = URLDecoder.decode(user,getAge(),"UTF-8");
		request.setAttribute("userName", user.getUserName());
		request.setAttribute("age", user.getAge());
		return "/userManager"
	}

视频十 获取controller中的josn数据

基本概念

现在有Gosn的jar包了 所以这节没怎么细看 = =

通过设置String格式获得josn格式

String result = “{“userName”:” “+ user.getUserName() +” “,“age”:” “+ user.getAge()+” “}”;

向response页面传递josn

通过PrintWriter来设置格式

response.setContentType(“application/json”);

功能实现

配置String使controller获取Ajax中的data数据

userManager.jsp

@RequestMapping("/addUserJson")
	public void addUserJson(User user,HttpServletRequest request,HttpServletResponse response){
		//{"username":"userName","age","age"}
		String result = "{\"userName\":\" "+ user.getUserName() +" \",\"age\":\" "+ user.getAge()+" \"}";
		PrintWriter out = null;
		response.setContentType("application/json");
		try {
			out = response.getWriter();
			out.write(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

视频十一 上传文件

基本概念

上传文件解析器

通过CommonsMultipartResolver解析器解析文件去实例化一个multipartResolver 通过以下几个标签配置上传限制

  1. defaultEncoding 编码格式
  2. maxUploadSize 文件最大大小
  3. maxInMemorySize 缓冲区

Spring通过对HttpServletRequest接口继续扩展,接口名为org.springframework.web.multipart.MultipartHttpServletRequest;

@RequestParam(“file”) CommonsMultipartFile 解析文件

文件的读取

通过FileOutputStream进行编写,InputStream逐个读取

enctype

enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。

注意!!!

文件的上传需要两个包 下载链接

  1. commons-codec-1.14.jar
  2. commons-fileupload-1.4.jar

文件上传一点要post方式,用get无法找到正确的路径

功能实现

文件上传功能

UploadController.java

@RequestMapping("/upload")
	public String addUser(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException{
		System.out.println("fileName---->" + file.getOriginalFilename());
		
		if(!file.isEmpty()){
			try {
				FileOutputStream os = new FileOutputStream("D:/" + new Date().getTime() + file.getOriginalFilename());
				InputStream in = file.getInputStream();
				int b = 0;
				while((b=in.read()) != -1){
					os.write(b);
				}
				os.flush();
				os.close();
				in.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return "/success";
	}

upload.jsp

<form name="userForm" action="/springMVC7/file/upload2" method="post" enctype="multipart/form-data" >
		选择文件:<input type="file" name="file">	
		<input type="submit" value="上传" >
</form>

视频十二 文件上传优化

基本概念

文件如何优化

上一节课中我们是通过自己一个个读取字节来实现文件上传的,现在使用Springmvc的CommonsMultipartResolver解析器进行上传,通过解析request来实现功能

CommonsMultipartResolver解析器
  1. multiRequest.getFileNames(); 获取request中所有文件的名字
  2. multiRequest.getFile(xxx); 通过名字获取文件
  3. .transferTo(file) 本地上传文件方法

如果需要上传到服务器上则需要 .InputStream 获得输入流来上传

功能实现

用CommonsMultipartResolver来上传文件
@RequestMapping("/upload2")
	public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{
		CommonsMultipartResolver multipartResolver  = new CommonsMultipartResolver(request.getSession().getServletContext());
		if(multipartResolver.isMultipart(request)){
			MultipartHttpServletRequest  multiRequest = (MultipartHttpServletRequest)request;
			Iterator<String>  iter = multiRequest.getFileNames();
			while(iter.hasNext()){
					MultipartFile file = multiRequest.getFile((String)iter.next());
				if(file != null){
					String fileName = "demoUpload" + file.getOriginalFilename();
					String path = "D:/" + fileName;
					File localFile = new File(path);
					file.transferTo(localFile);
				}			
			}	
		}
		return "/success";
	}

视频十三/四 和Spring集成

基本概念

省去了struts2 工厂和String的对接

不同框架的监听

Spting —> Listener

Struts2 —>filter

SpringMVC —>servlet

WEB容器的启动顺序
  1. Listener
  2. filter
  3. servlet
配置Spring入口

在web.xml中配置listener

 <listener>
  	 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
使用注解获取Bean

@Resource(name = “userManager”)

private IUserManager userManager

功能介绍

Spring集成

SpringController.java

@Controller
public class SpringController {
	@Resource(name="springManager")
	private ISpring springManager;
	
	@RequestMapping("/spring/get")
	public String get(){
		System.out.println(springManager.get());
		return "/success";
	}
}

SpringManager.java

public class SpringManager implements ISpring {

	@Override
	public String get() {
		System.out.println("------I am springManager----");
		return "I am getMethod";
	}
}

ISpring.java

public interface ISpring {
	public String get();
}

springAnnotation-core.xml

<beans>
	<bean id="springManager" class="com.tgb.web.controller.annotation.SpringManager">		</bean>
</beans>

视频十五 和Spring上下文关系

基本概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtpYW2QV-1582377370567)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200221210454663.png)]

Spring上下文

Spring上下文是Spring启动的时候Listener加载Spring的配置文件——SpringBean和一些依赖关系以及其他事务,上下文会遍历WebApplicationContext对象

SpringMVC的启动

在Spring启动后SpringMVC开始启动通过Servlet加载1个或N个上下文,一个classpath对应一个上下文,都是由Spring的跟上下文继承而来

功能介绍

通过获取上下文不适用注解访问
@Controller
public class SpringController {
		//Spring的上下文
		WebApplicationContext ao1 = 		WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServlerContext());
		//SpringMVC的上下文
		WebApplicationContext ao2 = RequestContextUtils.getWebApplicationContext(request);
ac1.getBean("springManager");
		System.out.println(springManager.get());
		return "/success";
	}
}
通过import导入本地配置文件
<import resource = "classpath":xxx.xml/>

视频十六/七 Spring+hibernate简单示例

基础概念

Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 下载地址:http://hibernate.org/

Hibernate五大对象
  • Configuration

    Configuration用于配置并启动Hibernate

  • SessionFactory

    一个SessionFactory对应一个数据源,它是个重量级对象,不可随意生成多个实例

  • Session

    从SessionFactory中可以获得Session实例

  • Transaction

    Transaction是Hibernate的数据库事务接口

  • Query和Criteria

    这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程

    使用Hibernate的前提

    导入相关的包,建立spring对Hibernate的配置文件

    <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
    

    localhost为ip,1521为默认端口号,ORCL为数据库名称

    <prop key="hibernate.show_sql">true</prop> 
    

    显示sql语句

    <prop key="hiberante.format_sql">true</prop>
    

    格式化sql语句

    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10Dialect</prop>
    

    配置sql方言

    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    

    自动更新表

    配置Entity

    @Entity 配置Entity类

    @Table(name = “xxx”) 表名

    @ID 主键

    @GeneratedValue(generator = “system-uuid”) 生成字符串

    @GenericGenerator(name = “system-uuid”, strategy = “uuid”) 自增

    @Column(length=32) 定义长度

功能实现

Hibernate配置

springAnnotation-hibernate.xml

<beans>
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
		<property name="userName" value="spring"/>
		<property name="password" value="spring"/>
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10Dialect</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop> 
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hiberante.format_sql">true</prop>
			</props>
		</property>
		<property name="configLocations">
			<list>
				<value>
					classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml
				</value>
			</list>
		</property>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
		<property name="transactionManager" ref="transactionManager"></property>
		<property name="transactionAttributes">
			<props>
				<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="get*">PROPAGATION_NEVER</prop>
			</props>
		</property>
	</bean>
</beans>

User.java

@Entity
@Table(name="T_USER")
public class User {
	
	@Id
	@GeneratedValue(generator = "system-uuid")  
    @GenericGenerator(name = "system-uuid", strategy = "uuid")  
	private String id;
	
	@Column(length=32)
	private String userName;
	
	@Column(length=32)
	private String age;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

视频十八 Spring+hibernate事务配置

基础概念

事务的拦截 HibernateTransactionManager

对事务的拦截基于AOP方法,transactionManager管理sessionFactory的拦截,只有请求到sessionFactory中的才对其进行拦截

事务的基类 TransactionProxyFactoryBean

代理Bean,配置事务的描述,遇到哪些问题开启事务

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

功能实现

事务配置
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
		<property name="transactionManager" ref="transactionManager"></property>
		<property name="transactionAttributes">
			<props>
				<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="get*">PROPAGATION_NEVER</prop>
			</props>
		</property>
	</bean>

视频十九 Spring+hibernate的实践

基本概念

Dao接口的引用

Spring要求的方式,必须通过接口才能实现代理类,否则会报错

三层架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3nsTl5G-1582377370568)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200222074431095.png)]

Dao的使用方法

通过SessionFactory获取当前的Session,通过Session来进行各种数据库操作

功能实现

三层架构的创建

IUserDAO.java 接口类

public interface IUserDAO {

	public void addUser(User user);

}

UserDAO.java

public class UserDAO implements IUserDAO  {

	private SessionFactory sessionFactory;
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public void addUser(User user) {
		sessionFactory.getCurrentSession().save(user);
	}
}

UserController.java

@Controller
@RequestMapping("/user")
public class UserController {
 
	@Resource(name="userManager")
	private IUserManager userManager;
	
	@RequestMapping("/addUser")
	public String addUser(User user){	
		userManager.addUser(user);	
		return "/success";
	}
}

IUserManager.java

public interface IUserManager {

	public void addUser(User user);

}

UserManager.java

public class UserManager implements IUserManager {
	
	private IUserDAO userDao;
	
	public void setUserDao(IUserDAO userDao) {
		this.userDao = userDao;
	}
	
	@Override
	public void addUser(User user) {
		userDao.addUser(user);
	}
}

视频二十/一 Spring+hibernate的实践2

基本概念

基础代理的配置

事务配置的核心,抽象类的引用时引用示例化的Dao,实体Manager引用抽象类,层层引用,避免了延时问题

java.lang.NoClassDelFoundError:org/aopailance/aop/Adcie

缺少**aopalliacne-1.0.jar包**

updata的一些注意

如果表不存在,则增加,增加表中缺少的字段,不删除原来存在的多余字段,并且不会更新已存在字段的长度

实现功能

相关配置
<beans>
	<bean id="userDao" class="com.tgb.web.controller.dao.UserDAO">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="userManagerBase" class="com.tgb.web.controller.service.UserManager">
		<property name="userDao" ref="userDao"></property>
	</bean>
	
	<bean id="userManager" parent="transactionBese">
		<property name="target" ref="userManagerBase"></property>
	</bean>
	
</beans>

视频二十二 Spring+hibernate查询实现

基本概念

hibernate查询

通过session来示例化一个query对象,里面的参数为sql语句,query.list 将查询结果转化为链表

No Session found for current thread

在使用数据时,session已经关闭导致的,一般是级联的时候,可以把要查的关联对象不设置检索,也可以在web.xml中配置一个过滤器

实现功能

hibernate查询实现

UserDAO.java

@Override
	public List<User> getAllUser() {
		String hql = "from User";
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		return query.list();
	}

UserController.java

@RequestMapping("/getAllUser")
	public String getAllUser(HttpServletRequest request){
		List<User> user = userManager.getAllUser();
		
		request.setAttribute("user", user);
		
		return "/userManager";
	}
拦截器配置

web.xml

 <filter>
  	<filter-name>openSession</filter-name>
  	<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  	</filter>
  
  <filter-mapping>
  	<filter-name>openSession</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

视频二十三 Spring+hibernate删除数据

基本概念

hibernate删除

query.setString()和jdbc的seting一样给sql语句中的?传值,执行query.executeUpdate()来更新表单,返回值是一个int类型,判断是否大于0从而判断是否删除成功

删除成功页面刷新

通过js的window.location.reload();实现

实现功能

UserDAO.java

@Override
	public boolean delUser(String id) {
		String hql = "delete User u where u.id=?";
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		query.setString(0, id);
	
		return (query.executeUpdate() > 0);
	}

UserController.java

@RequestMapping("/delUser")
	public void delUser(String id,HttpServletResponse response){
		String result = "{\"result\":\"error\"}";
		if(userManager.delUser(id)){
			result = "{\"result\":\"success\"}";
		}
		PrintWriter out = null;
		response.setContentType("application/json");
		
		try {
			out = response.getWriter();
			out.write(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

userManager.jsp

<script type="text/javascript">
	function del(id){
		$.get("/springMVC11/user/delUser?id=" + id,function(data){
			alert(data.result);
			if("success" == data.result){
				alert("删除成功!");
				window.location.reload(); 
			}else{
				alert("删除失败!")
			}
		});
	}

</script>
</head>
<body>
	<table border="1">
		<tbody>
			<tr>
				<th>姓名</th>
				<th>年龄</th>
				<th>编辑</th>
			</tr>
			<c:if test="${!empty user }">
			<c:forEach items="${user }" var="u">
			<tr>
				<td>${u.userName }</td>
				<td>${u.age }</td>
				<td>
					<a href="javascript:void(0);">编辑</a>
					<a href="javascript:del('${u.id }')">删除</a>
				</td>
			</tr>
			</c:forEach>
			</c:if>
		</tbody>
	</table>
</body>

视频二十四 Spring+hibernate查询单个实体

基本概念

修改步骤

查询——>修改——>重新查询该数据

返回entity

query.uniqueResult() 的返回值是Object类型 强制转为为你类的返回类型

重定向与转发的区别

请求重定向和请求转发都是web开发中资源跳转的方式。

请求转发是服务器内部的跳转

地址栏不发生变化

只有一个请求响应

可以通过request域传递数据

请求重定向是浏览器自动发起对跳转目标的请求

地址栏会发生变化

两次请求响应

无法通过request域传递对象

SpringMVC中实现转发和重定向

1.在springMVC中仍然可以使用传统方式实现和转发重定向

img

2.在SpringMVC中也提供了快捷方法实现转发和重定向

只要在返回视图时,使用如下方式指定即可:

img

img

3.可以利用转发 实现允许用户访问WEB-INF下保护的指定资源

img

Hibernate更新数据

原理和删除一样,只是sql语句的不同,query.setString()和jdbc的seting一样给sql语句中的?传值,执行query.executeUpdate()来更新表单,返回值是一个int类型,判断是否大于0从而判断是否修改成功

功能实现

编辑数据

UserDAO.java

@Override
	public boolean updateUser(User user) {
		String hql = "update User u set u.userName=?,u.age=? where u.id=?";
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		query.setString(0, user.getUserName());
		query.setString(1, user.getAge());
		query.setString(2, user.getId());
		
		return (query.executeUpdate() > 0);
	}

UserController.java

@RequestMapping("/updateUser")
	public String updateUser(User user,HttpServletRequest request){
		
		if(userManager.updateUser(user)){
			user = userManager.getUser(user.getId());
			request.setAttribute("user", user);
			return "/editUser";
		}else{
			return "/error";
		}
		
	}

UserManager.java

public class UserManager implements IUserManager {
	
	private IUserDAO userDao;
	
	
	public void setUserDao(IUserDAO userDao) {
		this.userDao = userDao;
	}


	@Override
	public void addUser(User user) {
		userDao.addUser(user);
	}


	@Override
	public List<User> getAllUser() {
		return userDao.getAllUser();
	}


	@Override
	public boolean delUser(String id) {
		return userDao.delUser(id);
	}


	@Override
	public User getUser(String id) {
		return userDao.getUser(id);
	}


	@Override
	public boolean updateUser(User user) {
		return userDao.updateUser(user);
	}

}

样,只是sql语句的不同,query.setString()和jdbc的seting一样给sql语句中的?传值,执行query.executeUpdate()来更新表单,返回值是一个int类型,判断是否大于0从而判断是否修改成功

功能实现

编辑数据

UserDAO.java

@Override
	public boolean updateUser(User user) {
		String hql = "update User u set u.userName=?,u.age=? where u.id=?";
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		query.setString(0, user.getUserName());
		query.setString(1, user.getAge());
		query.setString(2, user.getId());
		
		return (query.executeUpdate() > 0);
	}

UserController.java

@RequestMapping("/updateUser")
	public String updateUser(User user,HttpServletRequest request){
		
		if(userManager.updateUser(user)){
			user = userManager.getUser(user.getId());
			request.setAttribute("user", user);
			return "/editUser";
		}else{
			return "/error";
		}
		
	}

UserManager.java

public class UserManager implements IUserManager {
	
	private IUserDAO userDao;
	
	
	public void setUserDao(IUserDAO userDao) {
		this.userDao = userDao;
	}


	@Override
	public void addUser(User user) {
		userDao.addUser(user);
	}


	@Override
	public List<User> getAllUser() {
		return userDao.getAllUser();
	}


	@Override
	public boolean delUser(String id) {
		return userDao.delUser(id);
	}


	@Override
	public User getUser(String id) {
		return userDao.getUser(id);
	}


	@Override
	public boolean updateUser(User user) {
		return userDao.updateUser(user);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值