目录
视频一 概述和基本配置
基本概念
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类优化
- 在类上配置@RequestMapping("") 单个方法的配置就不用带上一个路径了
- 避免重复
- 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通过名字来获取值来进行下次传递
中文乱码
- 当传中文值过来时会乱码,因为默认是GBK格式 ,可以通过req.setCharacterEncoding(“UTF-8”)来解决乱码
- 通过Springmvc的配置来配置中文,配置图在功能实现中
- 设置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 通过以下几个标签配置上传限制
- defaultEncoding 编码格式
- maxUploadSize 文件最大大小
- maxInMemorySize 缓冲区
Spring通过对HttpServletRequest接口继续扩展,接口名为org.springframework.web.multipart.MultipartHttpServletRequest;
@RequestParam(“file”) CommonsMultipartFile 解析文件
文件的读取
通过FileOutputStream进行编写,InputStream逐个读取
enctype
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。
注意!!!
文件的上传需要两个包 下载链接
- commons-codec-1.14.jar
- 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解析器
- multiRequest.getFileNames(); 获取request中所有文件的名字
- multiRequest.getFile(xxx); 通过名字获取文件
- .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容器的启动顺序
- Listener
- filter
- 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中仍然可以使用传统方式实现和转发重定向
2.在SpringMVC中也提供了快捷方法实现转发和重定向
只要在返回视图时,使用如下方式指定即可:
3.可以利用转发 实现允许用户访问WEB-INF下保护的指定资源
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);
}
}