Featured image of post SSM——spring笔记

SSM——spring笔记

SSM笔记

1、编码过滤器

<!-- 编码过滤器 -->
    <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>*.action</url-pattern>
    </filter-mapping>

这段代码是一个编码过滤器的配置,使用了Spring框架中的CharacterEncodingFilter类。 该过滤器的名称为encoding,设置了参数encoding为UTF-8,表示对请求和响应使用UTF-8编码。 同时,通过filter-mapping指定了该过滤器拦截所有以.action结尾的URL请求。

编码过滤器的作用:在接收请求的资源中做编码设置与转换,在多个请求资源中都需要相同的操作,使用过滤器可以只需一次设置,整个Web可用。

2、Spring MVC前端核心控制器

    <!-- 配置Spring MVC前端核心控制器 -->
    <servlet>
        <servlet-name>crm</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
        <!-- 配置服务器启动后立即加载Spring MVC配置文件 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>crm</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

这段代码配置了Spring MVC的前端核心控制器。其中,servlet-name为crm,使用了org.springframework.web.servlet.DispatcherServlet作为核心控制器。 通过init-param设置了contextConfigLocation参数,指定了Spring MVC配置文件的位置为classpath:springmvc-config.xml。 在servlet-mapping中,将servlet-name为crm的DispatcherServlet映射到所有以.action结尾的URL请求上。这意味着所有以.action结尾的请求将由DispatcherServlet进行处理。

3、事务通知

    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS"
                       read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS"
                       read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS"
                       read-only="true" />
        </tx:attributes>
    </tx:advice>

这段代码是关于事务通知的配置。使用了tx:advice标签定义了一个名为txAdvice的事务通知,其中指定了transaction-manager为transactionManager。 在tx:attributes标签中,使用tx:method标签配置了多个方法级别的事务属性。例如,对于以save、insert、add、create、delete、update开头的方法,指定传播行为为REQUIRED;对于以find、select、get开头的方法,指定传播行为为SUPPORTS,并且设置read-only为true,表示只读事务。 这样可以根据方法名来灵活地设置不同的事务属性,从而控制方法执行时的事务行为。

REQUIRED是在Spring的事务管理中定义的传播行为之一。当一个方法被调用时,如果当前存在一个事务,该方法将加入该事务中执行;如果当前没有事务,则会开启一个新的事务。 简而言之,使用REQUIRED传播行为可以确保方法总是在一个事务中执行,要么加入已有的事务,要么创建一个新的事务。这样可以保证方法的一致性和隔离性。

SUPPORTS是在Spring的事务管理中定义的传播行为之一。当一个方法被调用时,如果当前存在一个事务,该方法将加入该事务中执行;如果当前没有事务,则会以非事务的方式执行。 简而言之,使用SUPPORTS传播行为可以让方法在有事务的环境下参与到该事务中执行,但也允许在没有事务的情况下以非事务方式执行。这种传播行为通常用于只读操作或者对事务性要求不高的操作。

4、Log4j介绍

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,我们可以控制每条日志的输出格式;只需要通过一个配置文件就可以灵活的配置,而不需要修改任何代码。

# Global logging configuration
# 设置日志输出级别以及输出目的地,可以设置多个输出目的地,开发环境下,日志级别要设置成DEBUG或者ERROR
# 前面写日志级别,逗号后面写输出目的地:我自己下面设置的目的地相对应,以逗号分开
# log4j.rootLogger = [level],appenderName1,appenderName2,…
log4j.rootLogger=DEBUG,CONSOLE,LOGFILE

#### 控制台输出 ####
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 输出到控制台
log4j.appender.CONSOLE.Target = System.out
# 指定控制台输出日志级别
log4j.appender.CONSOLE.Threshold = DEBUG
# 默认值是 true, 表示是否立即输出
log4j.appender.CONSOLE.ImmediateFlush = true
# 设置编码方式
log4j.appender.CONSOLE.Encoding = UTF-8
# 日志输出布局
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%c:%L) - %m%n



#### 输出错误信息到文件 ####
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# 指定输出文件路径
#log4j.appender.LOGFILE.File =F://Intellij idea/logs/error.log 
log4j.appender.LOGFILE.File =./logs/error.log 

#日志输出到文件,默认为true
log4j.appender.LOGFILE.Append = true
# 指定输出日志级别
log4j.appender.LOGFILE.Threshold = ERROR
# 是否立即输出,默认值是 true,
log4j.appender.LOGFILE.ImmediateFlush = true
# 设置编码方式
log4j.appender.LOGFILE.Encoding = UTF-8
# 日志输出布局
log4j.appender.LOGFILE.layout = org.apache.log4j.PatternLayout
# 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式
log4j.appender.LOGFILE.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

Log4j三大组件

Appender: 日志输出目标,用于指定日志输出的目的地,如控制台、文件等等。 Layout: 日志格式化器,用于指定日志按照什么格式输出,是日志输出的格式化器。 Logger: 日志记录器,日志记录的核心类,用于输出不同日志级别的消息。

  1. Appender: Log4j中用于控制日志输出的目的地,每一个Appender就表示一个输出目标,有以下几种:

    • ConsoleAppender:输出到控制台;

    • FileAppender:输出到指定文件;

    • DailyRollingFileAppender:每天产生一个单独的日志文件;

    • RollingFileAppender:限制日志文件大小,每当达到大小限制时生成一个新的日志文件;

    • WriterAppender:将日志信息以流格式发送到任意指定的地方;

  2. Layout: 日志输出格式,Log4j提供的layout有以下几种:

    • org.apache.log4j.HTMLLayout(以HTML表格形式布局),

    • org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

    • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

    • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

  3. Logger: 日志记录器是Log4j使用的核心类,通过Logger类可以设置日志消息的输出级别、输出目的地以及输出格式;

5、组件扫描

<!-- 配置扫描器 -->
<context:component-scan base-package="com.itheima.core.web.controller" />

<!-- 配置扫描@Service注解 -->
<context:component-scan base-package="com.itheima.core.service"/>
  1. 指定一个包路径,Spring会自动扫描改包及子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器

  2. 组件扫描可以替代大量的XML配置<bean>定义

自动扫描的注解标记

注解标记描述
@Component通用注解
@Name通用注解
@Respository持久层注解
@Service业务层组件注解
@Controller控制层组件注解

Spring容器并不是将配置到包中的所有类都进行加载。只有在组件前面有Spring的特定标记时,才会扫描到Spring的容器

自动扫描组件的命名

  1. 当一个组件在扫描的过程中被检测到时,会生成一个默认的id值,默认id为小写开头的类名称。

  2. 我们也可以通过注解标记,自定义id

6、依赖注入

依赖注入是一种消除类之间依赖关系的设计模式。例如,A类要依赖B类,A类不再直接创建B类,而是把这种依赖关系配置在外部xml文件(或java config文件)中,然后由Spring容器根据配置信息创建、管理bean类。

**依赖:**一个类的属性是对象的时候,称为依赖。

**注入:**给对象(类的某个属性)赋值。

五种方式

1、基于XML配置的依赖注入:这是一种最传统的依赖注入方式,通过在XML配置文件中使用标签来定义Bean,并且通过标签来指定Bean之间的依赖关系。这种方式下,开发人员需要手动编写XML配置文件来描述对象之间的关系。 例如:

<bean id="userService" class="com.example.UserService">
	<property name="userDao" ref="userDao"/>
</bean>   
<bean id="userDao" class="com.example.UserDao"/>

2、基于构造函数的依赖注入: 在这种方式下,Bean的依赖关系通过构造函数参数来进行传递。开发人员可以在Bean类中定义带有特定参数类型的构造函数,Spring容器在实例化Bean时会根据构造函数参数类型自动匹配并注入相应的依赖对象。 例如:

public class UserService {       
	private UserDao userDao;              
	public UserService(UserDao userDao) {           
		this.userDao = userDao;       
	}   
}

3、接口回调注入: Spring提供了一些特定接口(如InitializingBean、BeanPostProcessor等),开发人员可以通过实现这些接口,在初始化或者后处理阶段获取对容器和相关资源的访问权限,从而进行额外的操作或者进行依赖注入。

4、 自动装配(包括基于注解和名称): Spring提供了@Autowired和@Resource等注解以及元素来进行自动装配。使用@Autowired和@Resource等注解可以在字段、方法或者构造函数上声明需要自动注入的依赖对象。而元素可以用于XML配置文件中指定根据类型还是名称进行自动装配。

5、 基于Java配置类的依赖注入: 最新版本Spring Framework提供了@Configuration和@Bean等注解用于基于Java代码方式定义Bean和它们之间的依赖关系,这样就不再需要传统XML来完成相同功能了。 总体而言,无论采用哪种方式实现依赖注入,目标都是将组件之间的耦合降低到最小程度,并且使得系统更加灵活、可维护和可扩展。选择合适的方式取决于具体项目需求、团队技术栈以及个人偏好。

更多请看:基于注解的组件扫描

7、视图解析器

什么是视图解析器?

在 Spring MVC 中,控制器(Controller)的主要职责是处理用户请求,并产生模型数据(Model),同时指定该请求的逻辑视图名称(Logical View Name)。视图解析器的作用是将逻辑视图名称解析成实际的视图对象,以便最终在浏览器中呈现给用户。例如,当用户请求一个 URL 时,控制器可以返回一个逻辑视图名称为 “home”,而视图解析器会将其解析成一个 JSP 页面,最终在浏览器中渲染出来。

Spring MVC 提供了多种视图解析器,包括 InternalResourceViewResolver、XmlViewResolver、JsonViewResolver 等。其中,InternalResourceViewResolver 是最常用的一种,它通过解析逻辑视图名称为 JSP 或 HTML 文件来创建视图对象。

如何配置视图解析器?

在 Spring MVC 中,我们可以通过配置文件(XML 或 Java Config)来配置视图解析器。——配置文件方式 在 XML 配置文件中,我们可以使用 标签来定义视图解析器。下面是一个例子:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

视图解析器的使用

在使用 Spring MVC 进行 Web 开发时,我们通常会在控制器的方法中返回逻辑视图名称。例如:

@Controller
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("/")
    public String index() {
        return "hello";
    }
}

@Controller
public class CustomerController {
	//通过id获取客户信息
	@RequestMapping("/customer/getCustomerById.action")
	@ResponseBody
	public Customer getCustomerById(Integer id) {
	    Customer customer = customerService.getCustomerById(id);
	    return customer;
	}
}

在上面的代码中,我们使用@GetMapping 注解将 /hello/ 请求映射到 index() 方法,并在方法中返回了一个逻辑视图名称 “hello”。这里,“hello” 实际上是一个 JSP 文件的文件名(不包含后缀名),它会被 InternalResourceViewResolver 解析成一个 JSP 视图对象。

Licensed under CC BY-NC-SA 4.0