- 首先新建一个空白的maven项目,然后在项目名称上添加框架支持,web application,此时在src目录下多出一个web文件夹,在pom.xml中将项目的packaging方式改为war,默认为jar,这个的话不会把web文件打包到class中去。将web目录拖动到main目录下并将文件重命名为webapp,(maven项目中默认的web目录命名为webapp)
- 配置servlet: web.xml
配置项如下:——— welcome-file-list : 用于设置默认的首页,通过welcom-file来指定。默认目录是webapp,如果在子目录中可以写/XXX/XXX.jsp——— servlet/servlet-mapping: 用于设定处理相应URL的servlet,在servlet-mapping中有servlet-name,用于对应到servlet中的servlet-class,url-pattern用于确定要处理的URL,通过在javaPackage/web中定义相应的servlet实现来完成这个URL处理。在servlet中还有load-on-startup,用于确定这个servlet的加载时机,1的优先级比较高。如果用到spring开发,则会使用org.springframework.web.servlet.DispatcherServlet来分发请求,这时在同级目录下默认会有一个命名为servlet-name-servlet.xml的配置文件——— filter/filter-mapping: 有点类似于servlet/servlet-mapping,filter-mapping中的url-pattern用于确定对什么样的URL进行过滤,filter-name用于对应到filter中的filter-class,通过在javaPackage/filter中会定义相应的Filter来过滤相应的请求,同时在filter中还可以设置init-param,在init-param中包括param-name(e.g. encoding)和param-value(e.g. UTF-8)——— listener/context-param: 用于定义监听器,在发布的时候监听器的内容会被自动执行,其中如果定义了上下方加载监听器ContextLoaderListener,就在context-param中通过param-name(e.g. contextConfigLocation)和param-value(e.g. classpath: spring.xml)来确定要加载的上下文文件
- 如果在web.xml中配置了DispatcherServlet,就需要配置servlet-name-servlet.xml文件
配置项如下:——— context:component-scan base-package= "xxx" , 用于将加@Controller注解的类自动注册为Bean——— 特定需要的Bean(按需添加)
——— 视图解析器 jspViewResolver class="org".springframework.web.servlet.view.InternalResourceViewResolver,大致需要设置类中的三个property,包括viewClass(e.g. org.springframework.web.servlet.view.JstlView)、prefix(e.g. /WEB-INF/jsp/)和suffix(e.g. .jsp),它的作用是当Controller中返回String时对String进行视图解析,拼接上路径前缀和后缀
——— 文件上传解析器 multipartResolver class="org".springframework.web.multipart.commons.CommonsMultipartResolver
配置的参数主要有maxUploadSize(e.g. 1024000000)、resolveLazily(e.g. true)和maxInMemorySize(e.g. 4096)
- 配置在ContextLoaderListener中设定的上下文文件spring.xml
配置项如下:——— 如果在spring的配置中用到在properties文件中定义的键值,配置context:property-placeholder location = "classpath: *.properties" ignore-unresolvable="true"——— 通常情况下,spring中会对服务层Service和持久化层Dao进行分离,应该可以单独配置spring-dao.xml和spring-service.xml,此时需要在spring.xml中引入这两个配置文件,<import resource="classpath:spring-dao.xml"/> <import resource="classpath:spring-service.xml">
- spring-dao.xml
主要是用于配置数据库处理的相关内容:
——— 配置context: property-placeholder location="classpath*: system.properties" ignore-unresolvable="true",加载放置在属性文件中的值
——— 数据源, id=dataSource class="org".apache.commons.dbcp.BasicDataSource,主要property有driverClassName(e.g. ${jdbc.driverClassName},此参数为property文件中读取的值)、url(e.g. ${jdbc.url})、username(e.g. ${jdbc.username})和password(e.g. ${jdbc.password})
——— 事务管理器(用于处理@Transactional) id="transactionManager" class="org".springframework.jdbc.datasource.DataSourceTransactionManager(这个地方根据上述数据源的实现来进行相应的事务管理器的选择),它的property参数主要是dataSource,设置ref为上述定义的"dataSource"
——— 对于事务处理,通过<tx:annotation-driven/>来实现处理,如果上述事务管理器的id为transactionManager,则在这里面不需要配置相应的事务管理器(默认会加载这个命名的事务管事器),如果命名是随机的,通过transaction-manager="txManager"来指定
——— 对于jdbc,定义数据库初始化配置:jdbc:initialize-database,设定数据源data-source,一般为上述配置的数据源,它的参数为jdbc:script location="classpath:xxx.sql"
——— 对于需要数据库处理的,定义sqlSessionFactory, class="org".mybatis.spring.SqlSessionFactoryBean,它的参数主要是dataSource ref="dataSource"和configLocation value="classpath:mybatis-config.xml"
——— 同时,需要定义sqlSession class="org".mybatis.spring.SqlSessionTemplate,通过它的构造函数的参数constructor-arg来引用上述工厂ref="sqlSessionFactory",生成sqlSession
——— h2数据库(不理解)
- 配置spring-service.xml
目前仅仅用到注解扫描,bean: component-scan base-package="xxx"将给定目录下的带注解的对象自动注册bean由于之前已经处理过@Controller的注解,因此将其排除,设置它的属性,bean:exclude-filter type="annotatioin" expression="org.springframework.stereotype.Controller"
- mybatis-config.xml
用于配置mybatis的mappers和typeHandlers
——— mappers用于设定数据操作的配置文件,通过resource="mapper/xxx.xml",对应的xml文件中定义了利用sqlSession进行数据操作的内容
——— typeHandler用于处理当要插入数据库中的对象类型与数据库类型不匹配时进行类型转换处理。主要有handler(类型转换处理器)和javaType(要处理的对象类型)
- user.xml
用于定义sqlSession操作,当存在多个类型的文件时,可以对其定义namespace,这样便于sqlSession对特定namespace下的特定id进行操作。如果要插入数据库的类的属性命名和数据库中的字段完全相同,可不用写resultMap,如果不相同,通过resultMap来设定各个属性和数据库字段的映射关系后续部分编写相应的操作部分,包括insert, update, count等,这些字段放置在id中,用于sqlSession调用,同时对于各个操作,可以设定parameterType, resultMap, resultType等。mybatis中是通过#{}来获取属性的取值。当要插入的类型和数据库字段类型不一致时,需要在相应属性后设置typeHander来进行类型转换 - 实现相应的TypeHandler
继承TypeHandler<T>接口主要有一个setParameter函数和三个getResult函数,setParameter通过对类对象进行相应的处理,通过preparedStatement来将值传入到数据库字段中。详细实现如图,我也不是很懂。其中,对类对象进行的处理,需要在类对象中去实现这些方法。