ssm框架常用注释
@Value("${adImage.url}"):将配置文件中的值传入到属性中
@ResponseBody详解:将java对象转为json格式的数据
@RequestMapping("/login.do"):通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置。
- 测试 @RequestMapping 中的 value 和 path 属性
注解在 login 方法上的时候
@RequestMapping("/login")
http://localhost/SpringMVC/login
<a href="login">
注解在 user类上和login 方法上的时候
@RequestMapping("/user")
Public class UserController{@RequestMapping("/login")}
http://localhost/SpringMVC/user/login
<a href="user/login">
- 测试 @RequestMapping 的 method 属性
@RequestMapping(path = "/login", method=RequestMethod.GET)
限定post/get方式访问,post:表单访问,get:链接访问
3) 测试 @RequestMapping 的 params 属性,该属性表示请求参数
也就是追加在URL上的键值对,多个请求参数以&隔开,例如:
http://localhost/SpringMVC/user/login?username=kolbe&password=123456
用来限定请求参数,若请求参数与限定不同,则过滤返回HTTP 404
- 测试 @RequestMapping 的 headers 属性,该属性表示请求头
@RequestMapping(path = “/login”,headers=“Host=localhost:8080”)
可以限制客户端发来的请求
带占位符的URL(是Spring 3.0 新增的功能)
可以通过 @PathVariable 将 URL 中的占位符绑定到控制器的处理方法的参数中,占位符使用{}括起来。
@Controller
@RequestMapping(path = "/user")
public class UserController {
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public String show(@PathVariable("id") Integer id)
{return "success";}
}
在这个控制器中 show() 方法将可以接收 user/1、user/2、user/3等等的路径请求,请求的方法必须为GET,使用 @PathVariable 为应用实现 REST 规范提供了具大的便利条件。
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
- 使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。若需要返回json等内容到页面,则需要加@ResponseBody注解在相应的方法前。
- @RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。
- 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
@Transactional 声明式事务
- 根据你的配置,设置是否自动开启事务
- 自动提交事务或者遇到异常自动回滚
一般只在service配置文件中进行事务声明,声明代码如下:
扫描service包
<context:component-scan base-package="org.imooc.service" />
配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
事务采用全注解方式,配合@Transactional使用
<tx:annotation-driven transaction-manager="transactionManager"/>
a) 注解只能在抛出RuntimeException或者Error时才会触发事务的回滚
b) 只有public修饰的方法才会生效
c) 方法内自调用导致的事务不生效
使用nodejs可以实现前后端分离编程,html修改路径必知。
Html直接转为jsp页面是,html一般都是相对路径需要修改路径。就需要在每个路径前面加上一大堆,将一大堆提出来,新建jsp,然后再web.xml配置,最后在html相对路径前面添加${basePath}即可。
一大堆(相当于一直到项目名)
Web.xml配置
@RequestMapping("/index")
此行注释表示请求过来的地址,返回值会通过视图解析器。。。
单例模式和多例模式
Singleton:在Spring容器中仅存在一个共享的Bean实例,框架默认创建对象是单例的。
Prototype:每次从容器中都获取一个新的实例,相当于new。
有状态(有属性,会存储信息的)使用多例模式,因为线程不安全,防止单例。
Bean的三种调用方式
使用BeanWrapper 使用BeanFactory 使用ApplicationConttext
其中23,2需要使用inputstream,后者直接用。
1、使用BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
3、使用ApplicationConttext
ApplicationContext actx=new FileSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
mybatis中映射的entity基础类为啥用封装类型,不用基础类型
建议用封装类型,基础类有以下缺点。
1、因为要映射数据库字段,字段中要是null类型,基础类型映射会报错
2、基础类若是有子类了,子类的应用传输中有判断之类的时候,为空也会报错。
3、拼接sql时也有缺陷,后面我知道讲了我再来给大家说。
mybatis使用重点
mybatis中有两种开发方式,一种dao开发方式,一种mapper开发方式,后者用的比较多,但是不排除没有使用dao方式的
下面属于dao开发方式。
配置
通过mybatis-config.xml 配置数据源,定位mapper文件位置;
通过mapper.xml文件定义namespace、书写sql语句;
其中sql语句id作为标识符;
resultType:sql语句查询结果集的封装类型;
parameterType:sql语句输入参数的封装类型,在sql语句中直接使用 #{实例属性}即可使用到,如#{user_name}。
使用
加载mybatis-config.xml获得sqlSessionFactory;
打开工厂获得sqlsession;
通过sqlsession的方法进行数据库操作;
通常都是daoImpl先声明sqlsession,通过使用sqlsession的方法完成dao的impl
mapper开发方式
(mapper.xml中的namespace命名空间,作用就是对sql进行分类化管理,即sql隔离)
在dao方式中,这个namespace就是一个代号。
在mapper方式中:使用mapper代理方法开发的话,namespace就有特殊重要的作用了,namespace=mapper接口地址。下文AdDao为接口。
<mapper namespace="org.imooc.dao.AdDao">
配置
配置UserMapper.xml和UserMapper.java(mapper.xml和接口);
配置beans.xml,如下
<!--扫描Dao接口包,使用mybatis进行数据处理,以下有两种方法-->
<!-- MapperScannerConfigurer:只要给出接口所在的包即可,会自动把包中的接口引入 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="org.imooc.dao"/>
</bean>
<!-- MapperFactoryBean:把对应的所有接口在配置文件中引用 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="org.imooc.dao.ActionDao"/>
</bean>
spring使用MapperScannerConfiger来进行mapper扫描的。要想扫描成功,必须遵循之前说的规范,即mapper.xml和mapper.java两个文件名必须保持一致,且在同一个目录下。这样的话,自动扫描出来的mapper的bean的id就为mapper类名的首字母小写。所以上面的bean没有id属性,因为这个是根据具体的mapper接口来的。basePackage是用来指定要扫描的包。这样就可以批量扫描mapper接口了。
使用
无需写实现类,使用注解扫描的方式@Autowired(动态代理),即可获得代理类。
DataSourceTransactionManager,事务管理
目前项目一般有三类事务管理的做法:
一是传统的使用JDBC的事务管理,使用DataSource,从数据源中获取connection,通过con的api进行CRUD,手动的进行commit或者rollback;
二是应用spring提供的编程式的事务管理;
三是使用spring的声明式事务处理。关于spring提供的事务管理器DataSourceTransactionManager。Spring的事务处理中,通用的事务处理流程是由抽象事务管理器AbstractPlatformTransactionManager来提供的,而具体的底层事务处理实现,由PlatformTransactionManager的具体实现类来实现,如 DataSourceTransactionManager 、JtaTransactionManager和 HibernateTransactionManager等。