创建一个动态网站项目过程

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

你可能感兴趣的:(controller,service,sqlmap,context.xml,***-servlet.xml)