Java | SSM簡要筆記
最近有一個專案需要去做,在選擇語言時確定用Java。首先是因為很長一段時間沒有使用Java,再不重拾多半是要廢了;再則是暑假準備找個實習了,首選肯定還是Java方向。
這篇文章主要是我複習SSM(SpringMVC,Spring,MyBatis)框架時所做的筆記,側重於回憶和梳理,寫得比較粗糙,適用於理解結構和快速上手。
所以本篇適合人群:有Java基礎,對SSM框架有所瞭解但是基礎不牢概念模糊者。
後面有空的話我會針對單個框架,寫一些更加細節與原理有關的文章,幫助一些初學者,也使自己更加深入理解其中思想,畢竟這些都是開源世界的精髓!
Spring
最基本的幾個jar包:
- commons-logging
- spring-beans
- spring-context
- spring-core
- spring-expression
依賴注入
基本配置:resource/application-context
<bean id="user" class="...">
<constructor-arg type="int" value="111"></constructor>
<constructor-arg type="java.lang.String" value="hanshijun"></constructor>
</bean>
<bean id="user" class="...">
<property name="id" value="111"/>
<property name="name" value="hanshijun"/>
</bean>
在函式中呼叫:
ApplicationContext context=new ClassPathXmlApplicationContext("./xx/xx/resource/application-context");
User user=(User)context.getBean("user")//根據id獲得
User user=context.getrBean(User.Class)//根據型別獲得
註解方式注入:
- 四大註解:
- @Service:業務層
- @Component:公共元件
- @Controller:控制使用者請求,SpringMVC核心註解
- @Repository
- 需要jar包支援:
- aopalliance
- spring-sop
- aspectjweaver
- 簡單實現:
public interface UserService{
void hello();
}
@Service
public class UserServiceImpl implements UserService{
@override
public void hello(){
}
}
此時,在使用了Service註解後,不需要再在resource/application-context.xml中宣告bean,只需加入一個包掃描宣告,即可將所有打上註解的元件讀取。
<context:component-scan base-packge="xxxx.xxx.*"/>
面向切面程式設計
統一組織程式碼,攔截某些方法,在其執行前後,做一些操作。一種基於註解,一種基於xml。
- 基於註解
- 在application-context.xml中配置
<aop:aspectj-autoproxy>
- 新建一個切面
@Component
@Aspect //宣告切面
public class UserAspect{
@PointCut(value="execution(* cn.jihangyu.service.*.*(..))")//宣告切點以及切點所應用的範圍
public void pointCut(){}
@After(value="pointCut()")//宣告切點之後要做的
public void doAfter(JoinPoint joinPoint){//連線點,程式執行的點,多指程式的方法
}
@Before(value="pointCut()")//宣告切點之前要做的
public void doBefore(JoinPoint joinPoint){
}
@AfterReturning(value="pointCut()",returning="result")//獲取切點方法返回值的方法
public void afterReturning(JoinPoint joinPoint,Object result){
}
@Around(value="pointCut()")//在整個執行過程中環繞執行
public void around(ProceedingJoinPoint proceedingJoinPoint){
proceedingJoinPoint.proceed();
}
//等等
}
- 基於xml配置
在application-context.xml中
<bean id="userAop" class="..."></bean>
<aop:config>
<aop:aspect id="userAspect" ref="userAop">
<aop:around method=" around" pointcut="XXX"/>
</aop:aspect>
</aop:config>
切面程式設計原理
兩種實現方式
JDK的Proxy,InvocationHandler。
要求:必須實現介面
優勢:使用反射,建立效率高。cglib,使用asm,有關位元組碼
基於繼承
優勢:執行效率高
SpringMVC
Browser-DispatcherServlet-HandlerMapping-Controller-Service-ModelAndView-Model-ViewResolver
需要:
- 以上spring相關包
- spring-web
- spring-webmvc
配置:
- /resource/spring-mvc.xml下
mvc:annotation-driven
//註解驅動context:component-scan base-package="cn.jihangyu.*.*"
//包掃描
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value=""/>
<property name="suffix" value=""/>
<property name="viewClass" value=""/>
</bean>
//配置viewResolver
- web.xml 下
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:XXX/resource/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>//優先順序
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
//配置DispatcherServlet
GET,POST
- 獲取帶引數Get 請求方式
@RequestMapping("/test/{id}/{name}")
public String test(ModelMap modelMap,@PathVariable(“id”) Integer sid,@PathVariable String name){
//PathVariable 獲取傳過來值的引數名在不用(“”)標註的情況下,需要和傳過來引數的名字一致,如@PathVariable String name;如業務對變數名有特殊需要,可使用@PathVariable(“id”) Integer sid方式。
//ModelMap是用來返回的model的map,其中放鍵值對即可。
return "user"//返回名為test的view
}
- 獲取POST請求
@RequestMapping("/test")
public String test(ModelMap modelMap,HttpServletRequest request){
String id=request.getParameter("id")
return "user"
}
或
@RequestMapping("/test")
public String test(ModelMap modelMap,User user){
//直接操作封裝好的user物件
return "user"
}
- 使用阿里fastjson
- 導包
- /resource/spring-mvc.xml
<mvc:annotation-driven>
<mvc:mesage-converters>
<bean></bean>//具體配置就不寫了,隨用隨查
</mvc:mesage-converters>
</mvc:annotation-driven>
//【重要】注意書寫順序,要寫在全域性<mvc:annotation-driven>/
之前,否則會有406錯誤
- 返回json資料體
@RequestMapping("/test")
@ResponseBody//這個註解將會被上述配置的註解驅動識別,表示返回資料體
public User test(){
User user=new User(20,"hanshijun");
return user;
}
- 接收json資料體
@RequestMapping("/test")
public String test(@RequestBody User user){
return "user";//返回view
}
攔截器
攔截器和過濾器的比較
攔截器:基於反射,和Spring結合緊密,可以拿到處理IOC中的bean。
過濾器:基於Servlet,基於函式回撥,可以攔截所有請求。實現:
/src/xxx/xxx/interceptor
public class TestInterceptor implements HandlerInterceptor{
//三個重寫函式preHandler,postHandler,afterHandler
}
/src/xxx/xxx/resource/spring-mvc.xml
<mvc:interceptors>
<bean class=""/>//攔截所有請求
<mvc:interceptor>//攔截指定請求
<mvc:mapping path="test"/>
<bean class=""/>
</mvc:interceptor>
</mvc:interceptors>
上傳下載
- 導包
commons-io
,commons-upload
- /src/xxx/xxx/resource/spring-mvc.xml
<bean id="multipartResolver" class="org,springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="" value="">
<property name="" value="">
</bean>
- controller(上傳)
@RequestMapping("/upload")
public String upload(MultipartFile file,HttpServletRequest request){
String name=file.getOriginalFileName();
File uploadfile=new File("/"+name);
file.transFerTo(uploadfile);
return "upload"
}
- controller(下載)
@RequestMapping("download")
public ResponseEntity<byte []> download(){
String path="e:/xxx.txt";
File file=new File(path);
HttpHeaders headers=new HttpHeaders();
headers.setContentDispositionFormData("attachment",path);
headers.setContentType(MediaType.TXT);
return new ResponseEntity<byte []>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATE);
}
MyBatis
- 導包
mysql-connector
,mybatis
- 流程
App-Configuration(AqlMapConfig.xml,Config.xml)-SqlSessionFactory-SqlSession-MappedStatements-Transaction - 配置
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=
jdbc.password=
mybatis-cfg.xml
<configuration>
<properties resource="jdbc.properties" />//讀取資料庫連線配置
<typeAliases>
<package name=""/>
</typeAliases>//需要封裝的實體
<environments default="test">//配置環境
<environment id="mybatis-test">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"
<property name="url" value="${jdbc.url}"
<property name="username" value="${jdbc.username}"
<property name="password" value="${jdbc.password}"
</dataSource>
</environment>
</environments >
<mappers>//指定mapper的位置
<package name="">
</mappers>
</configuration>
UserMapper.xml
<mapper namespace="dao.UserMapper">
<resultMap id="userMapper" type="entity.User">
<id column="Sid" property="id"/>//主鍵
<result column="" property="">//其餘欄位和實體屬性一一匹配
<result column="" property="">
<result column="" property="">
</resultMap>
</mapper>
Main.java
public static void main(String [] args){
InputStream in=Main.class.getResourceAsStream("resource/mybatis-cfg.xml");//載入配置檔案
SQLSessionFactory factory=new SQLSessionFactoryBuilder().build(in);//構建工廠
SqlSesion session=factory.openSession();建立會話
UserMapper mappr=session.getMapper(UserMapper.class);
//可以開始呼叫mapper的運算元據庫方法
session.commit();
session.close();
}
SSM整合
- 導包
mybatis-spring
druid
連線池spring-jdbc
spring-tx
管理事務 - spring-config.xml
<aop:aspectj-autoproxy proxy-target-class="true"/>//開啟切面
<context:annotation-config/>
<context:component-scan base-package="cn.jihangyu"/>//掃描元件註解
<context:property-placeholder location="cn/jihangyu/resource/jdbc.properties"/>//讀取配置檔案
//配置sqlsession工廠
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>//資料來源位置
<property name="mapperLocations" value="cn/jihangyu/dao/**.xml"/>//mapper位置
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="backPackage" value="cn.jihangyu.dao"/>
<property name="SqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
//配置事務管理
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property in="transactionManager" name="dataSource" ref="dataSource"/>
</bean>
//配置資料來源(略)
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close" init-method="init">
<property />
<property />
<property />
<property />
//等等
</bean>
spring-mvc.xml
同上文mvc配置web.xml
<context-param>
<param-name>contextConfigLoader</param-name>
<param-value>cn/jihangyu/resource/spring-config.xml</param-value>
</context-param>
<listener>
<listen-class>org.springframework.web.context.ContextLoaderListener</listen-class>
</listener>
事務傳播機制
springMVC作為spring的子容器,假如在springMVC配置檔案中掃描全域性註解,那麼會將springMVC需要的除了controller以外的元件也掃描進去,而mvc子容器中掃描到的service是沒用事務能力的,所以會造成sql回滾失敗,導致資料庫插入髒資料。
所以需要在mvc配置檔案中掃描註解元件時加入額外的宣告。
<context:component-scan base-package="cn.jihangyu.**">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>//宣告除去service註解
</context>
事務傳播機制有七種
- REQUIRED:spring的預設事務傳播級別,特點是,如果上下文已經存在事務,那麼就加到事務中執行,如果不存在,就新建事務。
@Transactional("propagation=Propagation.REQUIRED")
- 其他的遇到實際的業務場景手動查資料
一個點贊,一次轉發,是對原創者的莫大支援。
相關文章
- Java集合 Collection、Set、Map、泛型 簡要筆記Java泛型筆記
- ssm框架整合筆記SSM框架筆記
- java筆記-one(簡記)Java筆記
- Spring入門筆記簡要Spring筆記
- SSM學習筆記3——整合 SpringMVC、整合SSMSSM筆記SpringMVC
- spring boot學習簡要筆記1Spring Boot筆記
- idea ssm maven專案搭建筆記IdeaSSMMaven筆記
- SSM簡介SSM
- java筆記-two-java泛型程式設計(簡記)Java筆記泛型程式設計
- Java SSM面試題JavaSSM面試題
- Java IO簡要方法總結Java
- SSM框架學習筆記_第1章_SpringIOC概述SSM框架筆記Spring
- Java基礎筆記09-陣列簡介Java筆記陣列
- java 筆記Java筆記
- Java筆記Java筆記
- 【Java筆記】Java JDKJava筆記JDK
- JAVA集合類簡要筆記 - 內部類 包裝類 Object類 String類 BigDecimal類 system類Java筆記ObjectDecimal
- Java 後臺效能優化簡要Java優化
- Java後臺效能優化簡要Java優化
- Spark簡明筆記Spark筆記
- CSS簡潔筆記CSS筆記
- docker簡單筆記Docker筆記
- 簡單微積分筆記筆記
- Java安全筆記Java筆記
- java 筆記(草稿)Java筆記
- Java自學筆記⑪Java筆記
- Java筆記02Java筆記
- Java筆記1Java筆記
- Java筆記——【Map】Java筆記
- Java筆記-反射Java筆記反射
- Java筆記-Java反射(二)Java筆記反射
- SSM框架實現高併發秒殺API學習筆記SSM框架API筆記
- 第63節:Java中的Spring MVC簡介筆記JavaSpringMVC筆記
- Machine Learning Yearning 要點筆記Mac筆記
- List簡易筆記一筆記
- Git常用簡約筆記Git筆記
- 《人類簡史》筆記筆記
- weex 的簡單筆記筆記