Spring项目的配置文件们(web.xml context servlet springmvc)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 我们的spring项目目前用到的配置文件包括1--web.xml文件,这是java的web项目都必须有的,我理解它是servlet的配置文件,也就是说,与spring无关。即使你开发的是一个纯粹jsp页面的web项目,你也必须配置这个文件。

我们的spring项目目前用到的配置文件包括
1--web.xml文件,这是java的web项目的配置文件。我理解它是servlet的配置文件,也就是说,与spring无关。即使你开发的是一个纯粹jsp页面的web项目,你也必须配置这个文件。
我们的java web项目肯定写了很多servlet代码,这些servlet需要运行在servlet容器中,这个容器就是tomcat的重要组件。也就是,你的web项目需要运行在tomcat中,那么你必须提供一个web.xml文件作为配置文件。
在这个文件中,通过context,也就是上下文,配置Spring。
同样filter,和servlet同等级别的概念的这个元素,也直接配置在web.xml中,因为filter是java中的web项目中本身就有的概念,而不是spring中才导入的概念。filter的意思就是看看request,不修改也不响应,但是可以对request中的信息进行匹配,看看是真的要交给servlet还是驳回去。
_

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>RepositoryCheck HUB</display-name>
  <!-- dao和service层的Spring配置文件 -->
  <!-- access的配置文件是accessContext.xml; mysql的配置文件是mysqlContext.xml -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/mysqlContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  
  <!-- web层的Spring配置文件 -->
      <servlet>
        <servlet-name>ruku</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ruku</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    
   <!-- 过滤器 编码 防止中文乱码 -->
    <filter>
        <filter-name>encodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <!-- 默认入口访问文件 -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

2--applicationContext文件,我们指的是Spring容器最基础的配置文件,名字可以随便起,但是整个项目被发布以后,它的默认位于WEB-INFclasses目录下。开发的过程中可以在web.xml文件中通过contextparam来配置这个文件的路径。它是spring进行依赖注入、事务管理等基础功能的配置文件。配置数据源啦,jdbcTemplate啦,都要依靠这个。比如你正在开发一个与web无关的数据库增删改查的spring项目,那么只需要用这个配置文件就可以了。
SpringMVC并没有在这个文件中配置,SpringMVC的配置文件是一个单独的xml文件,该文件通过web.xml文件中的servlet元素配置,或者说SpringMVC的本质是Spring公司实现的一个servlet,我们在开发的一开始,通过web.xml文件将这个servlet导入了我们的项目,于是我们就可以使用spring MVC了。
_

3--[name]-servlet.xml配置文件,我指的是SpringMVC的配置文件,通常该文件位于WEB-INF目录下,它的作用是配置Spring MVC,充当整个web项目的pipeline-value中的basevalue的角色,也就是最终的servlet。

上述内容,是我们开发的spring的web项目中用到的主要的配置文件,从上述内容我们可以看出来,和数据库连接有关的内容,也就是数据源的配置,发生在第二个配置文件,也就是applicatioinContext.xml文件中(名字可以改),
_
我们来看看其中一个mysqlContext.xml文件的内容:

<?xml version="1.0" encoding="UTF-8"?>  
<!-- mysql dao和service层的Spring配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        classpath:/org/springframework/beans/factory/xml/spring-beans.xsd     
        http://www.springframework.org/schema/context
        classpath:/org/springframework/context/config/spring-context.xsd
        http://www.springframework.org/schema/aop
        classpath:/org/springframework/aop/config/spring-aop.xsd
        http://www.springframework.org/schema/tx
        classpath:/org/springframework/transaction/config/spring-tx.xsd">     
        
    <context:component-scan base-package="com.tsmi.mysql.dao"/>
    <context:component-scan base-package="com.tsmi.mysql.service"/>
    <context:component-scan base-package="com.tsmi.mysql.web"/>
        
    <!-- 配置mysql数据源 -->
    <bean id="dsmysql" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" 
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:6062/test2?useSSL=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"
        p:username="root"
        p:password="密码不告诉你机密" 
        p:defaultAutoCommit="true" />

    <!-- 配置事务管理器 -->
     <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="dsmysql" /> 

    <!-- 配置JdbcTemplate -->
    <bean id="jdbcTemplate" 
        class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dsmysql" />
        
</beans> 

我们的项目同时连接了mysql和access数据库,上述配置文件时间上是mysql的配置文件部分。
我们都知道spring的配置有三种:基于xml,基于注解,基于java类。但是最常用的是第二种,基于注解的配置。
教材中也明确的说:笔者一般采用xml配置DataSource等资源Bean,在XML中利用aop,context命名空间进行相关主题的配置。但是所有项目中开发的Bean都通过基于注解的方式进行配置,也就是整个项目少量使用XML方式,大量使用基于注解方式,完全不采用java类方式。
通过我们自己开发的dao,service代码我们也可以看出来,因为大量使用了@Autowired注解,如下面代码示例所示

package com.tsmi.RepositoryCheck.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;

import com.tsmi.RepositoryCheck.domain.Lifnr;


@Repository
public class LifnrDao {
    
    /**
     * 声明JdbcTemplate的一个变量
     */
    private JdbcTemplate jdbcTemplate;

    /**
     * @param 注入JdbcTemplate的变量的实例
     */
    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    
    final static String SELECT_ALL = "select * from 供应商评价等级";
    
    /**
     * 获取所有
     * 供应商等级评价
     * @return
     */
    public List<Lifnr> getPernr(){
        
        final List<Lifnr> prs = new ArrayList<Lifnr>();
        
        jdbcTemplate.query(SELECT_ALL, new Object[] { }, new RowCallbackHandler() {

            public void processRow(ResultSet rs) throws SQLException {
                
                Lifnr pr = new Lifnr();
                
                pr.setSn(rs.getInt("编号"));
                pr.setsName(rs.getString("供应商名称"));
                pr.setsLevel(rs.getString("供应商评价等级"));
                pr.setsEval(rs.getString("供应商月度评价"));
                pr.setsMonth(rs.getString("评价月份"));
                
                prs.add(pr);
                
            }
        
        });
    
        return prs;
        
    }
    

}

我们声明变量,然后通过注解的方式,用@Autowired为变量实例化,用@Repository将类注册到spring容器中,供其他的类实例化的时候调用。

实例化的过程其实就是Spring的IOC容器按照某种规则对容器中的bean进行自动装配,这种装配不是显式的方式进行的依赖配置,是自动装配。那么装配的规则是怎样的呢?也就是,IOC容器根据什么做判断,谁装配给谁呢?
这其中最重要的就是mysqlContext.xml文件中的beans和bean元素,这两个元素都可以添加autowire属性,用来设置“自动装配类型”。
基于注解的配置方式中,默认采用autowire=byType这种策略进行自动装配。(记住是默认啊,就是这个属性压根不用出现在你的配置文件的bean中都可以,默认)
那么byType是什么意思呢?
假如说,我们要实例化的bean是一个JdbcTemplate,如果容器中刚好有一个JdbcTemplate,Spring就会将这个装配给需要被实例化的那个变量。
现在的问题是,假如我们在容器中已经有了两个备选的JdbcTemplate等着呢,容器怎么判断用哪个去实例化变量呢?

容器中已经有了两个备选的bean,怎么选?我觉得我们首先要搞清楚一下,默认情况下spring中的bean的作用域的问题。
教材5.8节表示,spring中bean的默认作用域是singleton,singleton的含义是说,在spring IOC容器中只存在一个bean的实例,bean以单例的方式存在。spring利用AOP和LocalThread功能,对非线程安全的变量进行处理,变成了线程安全。
Spring的ApplicationContext容器启动时,会自动实例化所有singleton的bean并缓存在容器中。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
1月前
新闻发布项目——Servlet类(doRegServlet )
新闻发布项目——Servlet类(doRegServlet )
9 0
|
1月前
新闻发布项目——Servlet类(doNewsAddServlet)
新闻发布项目——Servlet类(doNewsAddServlet)
10 0
|
1月前
新闻发布项目——Servlet类(doLoginServlet)
新闻发布项目——Servlet类(doLoginServlet)
12 0
|
1月前
新闻发布项目——Servlet类(doDelNewsServlet )
新闻发布项目——Servlet类(doDelNewsServlet )
11 0
|
1月前
新闻发布项目——Servlet类(doDelCategoryServlet )
新闻发布项目——Servlet类(doDelCategoryServlet )
8 0
|
1月前
新闻发布项目——Servlet类(doNewsModifyServlet )
新闻发布项目——Servlet类(doNewsModifyServlet )
11 0
|
1天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
12 0
|
25天前
|
前端开发 JavaScript 数据管理
描述一个使用Python开发Web应用程序的实际项目经验,包括所使用的框架和技术栈。
使用Flask开发Web应用,结合SQLite、Flask-SQLAlchemy进行数据管理,HTML/CSS/JS(Bootstrap和jQuery)构建前端。通过Flask路由处理用户请求,模块化代码提高可维护性。unittest进行测试,开发阶段用内置服务器,生产环境可选WSGI服务器或容器化部署。实现了用户注册登录和数据管理功能,展示Python Web开发的灵活性和效率。
14 4
|
30天前
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
19 1