完整代码网址: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,以发现基本错误;网络不好时,可关闭它。