完整代码网址:https://git.oschina.net/lcxx/login.git
1. src下的文件介绍
(1).java(包括controller.java和service.java)
model.addAttribute("类型", result); //将获取到的result的值传到画面上
queryDao.executeForObject()单条数据库信息查询
queryDao.executeForObjectList()多条数据库信息查询
public int insertUser(UserBean frm) {return updateDao.execute("User.insertUser", frm);} //插入,删除,修改操作都用此方法,execute()返回值为int型
类中的属性的get set方法一般不用手动写,可以通过source(Alt shift s)导入。
注意规范问题,变量名首字母小写从第2个单词开始首字母大写如userId,静态变量(常量)格式如USER_ID;代码应注意资源节省问题。
Crtl shift O组织导入包(一次性导入或删除所有包)
Crtl shift f 控制台界面代码格式调整(整齐)
(2)UserSqlMap.xml
<!DOCTYPE sqlMap PUBLIC "//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
sqlMap定义:<sqlMap namespace=" ">...</sqlMap>
sqlMap中的查询语句格式(有返回值类型resulClass,如果查询表中的所有内容,则没有WHERE语句)
<select id=" " parameterClass=" " resultClass=" ">SELECT ...,... FROM 表名 WHERE ... AND ...</select>
<select id=" " parameterClass=" " resultClass=" ">SELECT ...,... FROM 表名</select>
sqlMap中的更新语句格式(包括插入、删除、修改,无返回值类型resulClass)
<insert id=" " parameterClass=" ">INSERT INTO 表名(... , ...) VALUES(" ",#...#,...) </insert>
<delete id=" " parameterClass=" ">DELETE FROM 表名 WHERE ...</delete> //主键不能被更新
<update id=" "parameterClass=" ">UPDATE 表名 SET ...,... WHERE ...</update>
2. META-INF用来配置应用程序,扩展程序,类加载器和服务。
context.xml
<DOCTYPE html PUBLIC "//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">
连接mysql资源
<Context> <Resource name=" " type=" " driverClassName=" " username=" " password=" " url=" " useUnicode=" "characterEncoding=" " maxIdle=" " maxWait=" "maxActive=" "/> </Context>
3. (1)/WEB-INF/lib 存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。
(2)/WEB-INF/web.xml Web应用程序配置文件,描述了servlet和其他应用组件配置及命名规则。
<servlet>
<servlet-name>ab</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>...</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ab</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
当在web.xml文件将/后缀的请求交给org.springframework.web.servlet.DispatcherServlet后,web.xml会自动去读ab-servlet.xml。其中两个servlet-name必须一致。
<filter> <filter-name>...</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param><param-name>...</param-name><param-value>...</param-value></init-param> </filter> <filter-mapping> <filter-name>...</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
spring中解决乱码问题用过滤器,将所有的request请求内容统一成param-value中的编码格式。注意过滤器的顺序不能弄错了,否则它会无效。
(3)sqlMapConfig.xml
<DOCTYPE sqlMapConfig PUBLIC "//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
sqlMapConfig定义:
<sqlMapConfig> ... <sqlMap resource=" " /> ... </sqlMapConfig> <settings useStatementNamespaces=" " /> <typeHandler jdbcType=" " javaType=" " callback=" " />
(4)springMVC-servlet.xml
<beans xmlns=" " xmlns:xsi=" " xmlns:tx=" " xmlns:context=" " xmlns:aop=" " xmlns:mvc=" " xmlns:util=" " xsi:schemaLocation=" ">
所有的xml只遵循一个规则:父类结点只有一个(要包含xml中所有的模块,以便遍历到所有内容)。
xml中可以添加任何标签,如<beans>,但要自己写一个相应的解析器。
<context:component-scan base-package="cn.training" /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <mvc:resources mapping="/img/**" location="/img/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" />
<context:component-scan base-package=""/>表示扫描指定的包,扫描workspace下的**包的java文件中的标准spring标签,将注解的类注册为spring容器中的bean,那么此时我们在xml文件中就不需要定义bean,实现xml文件的零配置。
<mvc:annotation-driven/>表示在SpringMVC中注册了DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,表示为@controller、@requestMapping做好准备工作,但是 此时被注解的bean并没有被加入到spring容器中。要使用spring mvc中的@Controller注解,就必须要配置<mvc:annotation-driven />,否则org.springframework.web.servlet.DispatcherServlet无法找到控制器并把请求分发到控制器。
<mvc:default-servlet-handler/>当有请求时没有匹配的处理请求类,都去<mvc:default-servlet-handler/>即default servlet处理。添加上<mvc:annotation-driven/>后,相应的do请求被Controller处理,而静态资源因为没有相应的Controller会被default servlet处理。总之没有相应的Controller就会被default servlet处理。
静态资源映射,画面上需要用到的图片、css层叠样式、JavaScript脚本语言。
所有当有请求时候都没有匹配的处理请求类,就都去<mvc:default-servlet-handler/>即default servlet处理了。添加上<mvc:annotation-driven/>后,相应的do请求被Controller处理,而静态资源因为没有相应的Controller就会被default servlet处理。总之没有相应的Controller就会被default servlet处理就ok了。ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" /> <bean id="TerasolunaSampleDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/TerasolunaSampleDataSource</value> <!-- <value>jdbc/TerasolunaSampleDataSource</value> --> </property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="TerasolunaSampleDataSource" /> </bean> <tx:advice id="transactionInterceptor"> <tx:attributes> <tx:method name="execute*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice>
在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob;ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob。有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。
<aop:config> <aop:pointcut id="daoBeans" expression="bean(*Controller)" /> <aop:advisor pointcut-ref="daoBeans" advice-ref="transactionInterceptor" /> </aop:config>
AOP定义一般都是固定的。
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="WEB-INF/sqlMapConfig.xml"></property> <property name="dataSource" ref="TerasolunaSampleDataSource" /> <property name="lobHandler" ref="lobHandler" /> </bean>
SqlMap定义
<bean id="queryDAO" class="jp.terasoluna.fw.dao.ibatis.QueryDAOiBatisImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> <bean id="updateDAO" class="jp.terasoluna.fw.dao.ibatis.UpdateDAOiBatisImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> <bean id="spDAO" class="jp.terasoluna.fw.dao.ibatis.StoredProcedureDAOiBatisImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> <bean id="queryRowHandleDAO" class="jp.terasoluna.fw.dao.ibatis.QueryRowHandleDAOiBatisImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean>
DAO定义
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames" value="application-messages, system-messages" /> </bean>
message处理
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
HandlerMapping和HandlerAdapter一般成对使用,用于调用@controller、@requestMapping。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
ViewResolver视图解析器
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB-INF/html/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML5" /> </bean> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> </bean> <bean id="viewResolverThymeleaf" class="cn.agriculture.common.component.ThymeleafViewResolverEx"> <property name="templateEngine" ref="templateEngine" /> <property name="characterEncoding" value="UTF-8"/> <property name="order" value="0"/> </bean>
thymeleaf试图解析器:<property name="order" value="0"/>表示首先执行thymeleaf
这两种解析器二选一使用,不能同时被使用。
其中class="cn.agriculture.common.component.ThymeleafViewResolverEx"的cn.agriculture.common.component包下的ThymeleafViewResolverEx类代码如下
@Slf4j public class ThymeleafViewResolverEx extends ThymeleafViewResolver { @Override public View resolveViewName(String viewName, Locale locale) throws Exception { ServletContextTemplateResolver servletContextTemplateResolver = (ServletContextTemplateResolver)this.getWebApplicationContext().getBean("templateResolver"); servletContextTemplateResolver.initialize(); String prefix = servletContextTemplateResolver.getPrefix().substring(1); String suffix = servletContextTemplateResolver.getSuffix(); log.info("-----------------------------" + this.getServletContext().getRealPath("/")); File file = new File(this.getServletContext().getRealPath("/") + prefix + viewName + suffix); if (!file.exists()){ return null; } return super.resolveViewName(viewName, locale); } }
验证xml: 1)项目里的...-servlet.xml文件验证
2)网络较好时,打开window-preferences-validation,以发现基本错误;网络不好时,可关闭它。