间隔这么久才写这个实践,一是由于最近在忙着工作上的编码测试,二是自己需要梳理mybatis相关内容,故到昨天晚上才开始写了一个联合测试的demo。此demo主要使用spring mvc、spring、mybatis、封装的mybatis、druid连接池等技术。
一、环境搭建:
环境的搭建在此处费了不少周折,第一次直接使用的maven,没有分模块,结果还是maven使用不熟悉,工程搞的很乱。第二次学乖了,分模块进行,不过为了简便,此处只分了两个模块,一个是后台代码(非页面及配置文件)、一个是页面及配置文件。
首先,创建maven project ,web-1 类型为pom;然后创建maven moduel ,web-m 类型为jar,最后创建模块 web-war,类型为war。
创建后的各个pom.xml如下:
web-1 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yuxi.web1</groupId><artifactId>web-1</artifactId><version>1.0.0</version><packaging>pom</packaging><name>web1</name><description>web1-1</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.1.1.RELEASE</version><exclusions><!-- Exclude Commons Logging in favor of SLF4j --><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>3.1.4.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.19</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.0</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>3.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.2</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.10</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.25</version></dependency><dependency><groupId>com.yuxi.common.dal</groupId><artifactId>pageInfoMyBatis</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.3.1.Final</version></dependency></dependencies><modules><module>web-m</module><module>web-war</module></modules><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><dependencies><dependency><groupId>org.codehaus.plexus</groupId><artifactId>plexus-compiler-javac</artifactId><version>1.8.1</version></dependency></dependencies></plugin></plugins></build></project>
web-m pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>web-1</artifactId><groupId>com.yuxi.web1</groupId><version>1.0.0</version></parent><groupId>com.yuxi.web1</groupId><artifactId>web-m</artifactId><version>1.0.0</version><name>web-m</name><description>web-main</description></project>
web-war pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>web-1</artifactId><groupId>com.yuxi.web1</groupId><version>1.0.0</version></parent><groupId>com.yuxi.web1</groupId><artifactId>web-war</artifactId><version>1.0.0</version><packaging>war</packaging><name>web-war</name><description>web-war</description><dependencies><dependency><groupId>com.yuxi.web1</groupId><artifactId>web-m</artifactId><version>1.0.0</version></dependency></dependencies><build><plugins><!-- jetty插件 --><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>6.1.26</version><configuration><webAppSourceDirectory>src/main/webapp</webAppSourceDirectory><scanIntervalSeconds>3</scanIntervalSeconds><contextPath>/web-war</contextPath><webDefaultXml>jetty.xml</webDefaultXml><jettyEnvXml>jetty-env.xml</jettyEnvXml><connectors><connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"><port>9000</port></connector></connectors></configuration></plugin></plugins></build></project>
其中使用了jetty为web容器,相关的jetty配置如下:
jetty.xml
<?xml version="1.0" encoding="ISO-8859-1"?><!-- ===================================================================== --><!-- This file contains the default descriptor for web applications. --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><!-- The intent of this descriptor is to include jetty specific or common --><!-- configuration for all webapps. If a context has a webdefault.xml --><!-- descriptor, it is applied before the contexts own web.xml file --><!-- --><!-- A context may be assigned a default descriptor by: --><!-- + Calling WebApplicationContext.setDefaultsDescriptor --><!-- + Passed an arg to addWebApplications --><!-- --><!-- This file is used both as the resource within the jetty.jar (which is --><!-- used as the default if no explicit defaults descriptor is set) and it --><!-- is copied to the etc directory of the Jetty distro and explicitly --><!-- by the jetty.xml file. --><!-- --><!-- ===================================================================== --><web-appxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"metadata-complete="true"version="2.5"><description>Default web.xml file.This file is applied to a Web application before it's own WEB_INF/web.xml file</description><!-- ==================================================================== --><!-- Context params to control Session Cookies --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><!-- UNCOMMENT TO ACTIVATE<context-param><param-name>org.mortbay.jetty.servlet.SessionDomain</param-name><param-value>127.0.0.1</param-value></context-param><context-param><param-name>org.mortbay.jetty.servlet.SessionPath</param-name><param-value>/</param-value></context-param><context-param><param-name>org.mortbay.jetty.servlet.MaxAge</param-name><param-value>-1</param-value></context-param>--><context-param><param-name>org.mortbay.jetty.webapp.NoTLDJarPattern</param-name><param-value>start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar</param-value></context-param><!-- ==================================================================== --><!-- The default servlet. --><!-- This servlet, normally mapped to /, provides the handling for static --><!-- content, OPTIONS and TRACE methods for the context. --><!-- The following initParameters are supported: --><!-- --><!-- acceptRanges If true, range requests and responses are --><!-- supported --><!-- --><!-- dirAllowed If true, directory listings are returned if no --><!-- welcome file is found. Else 403 Forbidden. --><!-- --><!-- redirectWelcome If true, redirect welcome file requests --><!-- else use request dispatcher forwards --><!-- --><!-- gzip If set to true, then static content will be served--><!-- as gzip content encoded if a matching resource is --><!-- found ending with ".gz" --><!-- --><!-- resoureBase Can be set to replace the context resource base --><!-- --><!-- relativeResourceBase --><!-- Set with a pathname relative to the base of the --><!-- servlet context root. Useful for only serving --><!-- static content from only specific subdirectories. --><!-- --><!-- useFileMappedBuffer --><!-- If set to true (the default), a memory mapped --><!-- file buffer will be used to serve static content --><!-- when using an NIO connector. Setting this value --><!-- to false means that a direct buffer will be used --><!-- instead. If you are having trouble with Windows --><!-- file locking, set this to false. --><!-- --><!-- cacheControl If set, all static content will have this value --><!-- set as the cache-control header. --><!-- --><!-- maxCacheSize Maximum size of the static resource cache --><!-- --><!-- maxCachedFileSize Maximum size of any single file in the cache --><!-- --><!-- maxCachedFiles Maximum number of files in the cache --><!-- --><!-- cacheType "nio", "bio" or "both" to determine the type(s) --><!-- of resource cache. A bio cached buffer may be used--><!-- by nio but is not as efficient as a nio buffer. --><!-- An nio cached buffer may not be used by bio. --><!-- --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><servlet><servlet-name>default</servlet-name><servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class><init-param><param-name>acceptRanges</param-name><param-value>true</param-value></init-param><init-param><param-name>dirAllowed</param-name><param-value>true</param-value></init-param><init-param><param-name>redirectWelcome</param-name><param-value>false</param-value></init-param><init-param><param-name>maxCacheSize</param-name><param-value>256000000</param-value></init-param><init-param><param-name>maxCachedFileSize</param-name><param-value>10000000</param-value></init-param><init-param><param-name>maxCachedFiles</param-name><param-value>1000</param-value></init-param><init-param><param-name>cacheType</param-name><param-value>both</param-value></init-param><init-param><param-name>gzip</param-name><param-value>true</param-value></init-param><init-param><param-name>useFileMappedBuffer</param-name><param-value>false</param-value></init-param><!--<init-param><param-name>cacheControl</param-name><param-value>max-age=3600,public</param-value></init-param>--><load-on-startup>0</load-on-startup></servlet><servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping><!-- ==================================================================== --><!-- JSP Servlet --><!-- This is the jasper JSP servlet from the jakarta project --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><!-- The JSP page compiler and execution servlet, which is the mechanism --><!-- used by Glassfish to support JSP pages. Traditionally, this servlet --><!-- is mapped to URL patterh "*.jsp". This servlet supports the --><!-- following initialization parameters (default values are in square --><!-- brackets): --><!-- --><!-- checkInterval If development is false and reloading is true, --><!-- background compiles are enabled. checkInterval --><!-- is the time in seconds between checks to see --><!-- if a JSP page needs to be recompiled. [300] --><!-- --><!-- compiler Which compiler Ant should use to compile JSP --><!-- pages. See the Ant documenation for more --><!-- information. [javac] --><!-- --><!-- classdebuginfo Should the class file be compiled with --><!-- debugging information? [true] --><!-- --><!-- classpath What class path should I use while compiling --><!-- generated servlets? [Created dynamically --><!-- based on the current web application] --><!-- Set to ? to make the container explicitly set --><!-- this parameter. --><!-- --><!-- development Is Jasper used in development mode (will check --><!-- for JSP modification on every access)? [true] --><!-- --><!-- enablePooling Determines whether tag handler pooling is --><!-- enabled [true] --><!-- --><!-- fork Tell Ant to fork compiles of JSP pages so that --><!-- a separate JVM is used for JSP page compiles --><!-- from the one Tomcat is running in. [true] --><!-- --><!-- ieClassId The class-id value to be sent to Internet --><!-- Explorer when using <jsp:plugin> tags. --><!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] --><!-- --><!-- javaEncoding Java file encoding to use for generating java --><!-- source files. [UTF-8] --><!-- --><!-- keepgenerated Should we keep the generated Java source code --><!-- for each page instead of deleting it? [true] --><!-- --><!-- logVerbosityLevel The level of detailed messages to be produced --><!-- by this servlet. Increasing levels cause the --><!-- generation of more messages. Valid values are --><!-- FATAL, ERROR, WARNING, INFORMATION, and DEBUG. --><!-- [WARNING] --><!-- --><!-- mappedfile Should we generate static content with one --><!-- print statement per input line, to ease --><!-- debugging? [false] --><!-- --><!-- --><!-- reloading Should Jasper check for modified JSPs? [true] --><!-- --><!-- suppressSmap Should the generation of SMAP info for JSR45 --><!-- debugging be suppressed? [false] --><!-- --><!-- dumpSmap Should the SMAP info for JSR45 debugging be --><!-- dumped to a file? [false] --><!-- False if suppressSmap is true --><!-- --><!-- scratchdir What scratch directory should we use when --><!-- compiling JSP pages? [default work directory --><!-- for the current web application] --><!-- --><!-- tagpoolMaxSize The maximum tag handler pool size [5] --><!-- --><!-- xpoweredBy Determines whether X-Powered-By response --><!-- header is added by generated servlet [false] --><!-- --><!-- If you wish to use Jikes to compile JSP pages: --><!-- Set the init parameter "compiler" to "jikes". Define --><!-- the property "-Dbuild.compiler.emacs=true" when starting Jetty --><!-- to cause Jikes to emit error messages in a format compatible with --><!-- Jasper. --><!-- If you get an error reporting that jikes can't use UTF-8 encoding, --><!-- try setting the init parameter "javaEncoding" to "ISO-8859-1". --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><servlet id="jsp"><servlet-name>jsp</servlet-name><servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class><init-param><param-name>logVerbosityLevel</param-name><param-value>DEBUG</param-value></init-param><init-param><param-name>fork</param-name><param-value>false</param-value></init-param><init-param><param-name>xpoweredBy</param-name><param-value>false</param-value></init-param><!--<init-param><param-name>classpath</param-name><param-value>?</param-value></init-param>--><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>*.jsp</url-pattern><url-pattern>*.jspf</url-pattern><url-pattern>*.jspx</url-pattern><url-pattern>*.xsp</url-pattern><url-pattern>*.JSP</url-pattern><url-pattern>*.JSPF</url-pattern><url-pattern>*.JSPX</url-pattern><url-pattern>*.XSP</url-pattern></servlet-mapping><!-- ==================================================================== --><!-- Dynamic Servlet Invoker. --><!-- This servlet invokes anonymous servlets that have not been defined --><!-- in the web.xml or by other means. The first element of the pathInfo --><!-- of a request passed to the envoker is treated as a servlet name for --><!-- an existing servlet, or as a class name of a new servlet. --><!-- This servlet is normally mapped to /servlet/* --><!-- This servlet support the following initParams: --><!-- --><!-- nonContextServlets If false, the invoker can only load --><!-- servlets from the contexts classloader. --><!-- This is false by default and setting this --><!-- to true may have security implications. --><!-- --><!-- verbose If true, log dynamic loads --><!-- --><!-- * All other parameters are copied to the --><!-- each dynamic servlet as init parameters --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><!-- Uncomment for dynamic invocation<servlet><servlet-name>invoker</servlet-name><servlet-class>org.mortbay.jetty.servlet.Invoker</servlet-class><init-param><param-name>verbose</param-name><param-value>false</param-value></init-param><init-param><param-name>nonContextServlets</param-name><param-value>false</param-value></init-param><init-param><param-name>dynamicParam</param-name><param-value>anyValue</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>--><!-- ==================================================================== --><session-config><session-timeout>30</session-timeout></session-config><!-- ==================================================================== --><!-- Default MIME mappings --><!-- The default MIME mappings are provided by the mime.properties --><!-- resource in the org.mortbay.jetty.jar file. Additional or modified --><!-- mappings may be specified here --><!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --><!-- UNCOMMENT TO ACTIVATE<mime-mapping><extension>mysuffix</extension><mime-type>mymime/type</mime-type></mime-mapping>--><!-- ==================================================================== --><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- ==================================================================== --><locale-encoding-mapping-list><locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping><locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping></locale-encoding-mapping-list><security-constraint><web-resource-collection><web-resource-name>Disable TRACE</web-resource-name><url-pattern>/</url-pattern><http-method>TRACE</http-method></web-resource-collection><auth-constraint/></security-constraint></web-app>
jetty-env.xml
<Configure id='wac' class="org.mortbay.jetty.webapp.WebAppContext"></Configure>
这个主要是为了有些地方需要配置jndi使用。
PS:此处记录下build.xml(maven打包)
<?xml version="1.0" encoding="UTF-8"?><project name="app" default="compiler"><target name="compiler"><property name="dir.compiler.home" location="." /><exec executable="cmd" failonerror="true" dir="${dir.compiler.home}"><arg line="/c mvn clean install -Dmaven.test.skip=true" /></exec></target></project>
二、业务代码简单介绍
1、代码的基本结构:代码还是按照controller、servicer、dao、dto、dmo的路径来进行,此处由于没有需要进行封装传输的数据,所以dto为空,
其中的captcha是添加的验证码,spring为一些辅助类。
其中的captcha是添加的验证码,spring为一些辅助类。
2、代码实现的功能:代码其实很简单,Student这个表分页查询、插入、根据ID删除。
3、war中的配置信息:可能使用ssi最头痛的就是这个ssi的配置了。此处也是花时间最多的,重点也是介绍下这个配置。
这个地方需要注意的是文件目录,在web-war项目里面的src的main下面建webapp文件夹,再在其中建WEB-INF,这个就熟悉了
(1)、web.xml (WEB-INF目录下)
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>web-war</display-name><filter><filter-name>Set Character Encoding</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>Set Character Encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><listener><listener-class>com.yuxi.web.spring.ContextLoaderListener</listener-class></listener><filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.bmp,*.html,*.xml,*.swf,*.ico,/jmx-/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class></servlet><servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern></servlet-mapping><servlet><servlet-name>VerifyCodeServlet</servlet-name><servlet-class>com.yuxi.web.captcha.CaptchaServlet</servlet-class></servlet><servlet-mapping><servlet-name>VerifyCodeServlet</servlet-name><url-pattern>/code/captcha</url-pattern></servlet-mapping><servlet><servlet-name>ResultServlet</servlet-name><servlet-class>com.yuxi.web.captcha.ValidationServlet</servlet-class></servlet><servlet-mapping><servlet-name>ResultServlet</servlet-name><url-pattern>/code/vali</url-pattern></servlet-mapping><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-servlet.xml</param-value></init-param><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- Spring 刷新Introspector防止内存泄露 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list></web-app>
记录:此处配置出现了版本问题,导致在打包中出现找不到spring的某个类,具体类不记得了。后来修改了spring的版本,3.1.4.RELEASE就不会出现问题。
2、applicationContext.xml
<?xml version="1.0" encoding="utf8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"default-autowire="byName" default-lazy-init="false"><!-- 自动扫描其中把controller的不扫描,在spring-servlet中进行单独扫描 --><context:component-scan base-package="com.yuxi" ><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 打开aop 注解--><aop:aspectj-autoproxy/><!-- 外部配置文件,主要是数据库配置信息 --><context:property-placeholder location="classpath:application.properties" /><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="filters" value="stat"/><property name="maxActive" value="${maxConnection}"/><property name="initialSize" value="${initConnection}"/><property name="minIdle" value="${minConnection}"/><property name="maxWait" value="60000"/><property name="timeBetweenEvictionRunsMillis" value="3000"/><property name="minEvictableIdleTimeMillis" value="300000"/><property name="validationQuery" value="SELECT 'x'"/><property name="testWhileIdle" value="true"/><property name="testOnBorrow" value="false"/><property name="testOnReturn" value="false"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--dataSource属性指定要用到的连接池 --><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:mybatis/*Mapper.xml" /><property name="typeAliasesPackage" value="com.yuxi.web.*" /><!--configLocation属性指定mybatis的核心配置文件 --><property name="configLocation" value="classpath:configuration.xml" /></bean><!-- 设置sqlSession --><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg ref="sqlSessionFactory" /></bean><!-- 设置myBatisSessionManager --><bean id="myBatisSessionManager" class="com.yuxi.common.dal.mybatis.MyBatisSessionManager"><property name="sessionMap"><map><entry key="default" value-ref="sqlSession" /></map></property></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--所有以find开头的方法都是只读的 --><tx:method name="find*" read-only="true" /><tx:method name="save*" /><!--其他方法使用默认事务策略 --><tx:method name="*" /></tx:attributes></tx:advice><!-- AOP配置 --><aop:config><!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,这里星号表明匹配所有返回类型。 com.abc.dao.*.*(..)表明匹配com.abc.dao包下的所有类的所有方法 --><aop:pointcut id="myPointcut" expression="execution(* com.yuxi.web.service.*.*(..))" /><!--将定义好的事务处理策略应用到上述的切入点 --><aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /></aop:config><bean id="druid-stat-interceptor"class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"/><bean id="druid-type-proxyCreator"class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator"><property name="targetBeanType"value="com.yuxi.common.dal.mybatis.DalBaseDao"/><property name="interceptorNames"><list><value>druid-stat-interceptor</value></list></property></bean></beans>
其中的配置基本上都说过,加上注释后,还能回忆起来,当然其中的druid配置信息,后期补上去。这个真是好东西。希望以后能用到
spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="com.yuxi.web"use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 会自动注册了validator ConversionService --><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.yuxi.web.spring.StringToDateConverter"/></set></property></bean><mvc:annotation-driven validator="validator" conversion-service="conversionService"><mvc:message-converters register-defaults="true"><!-- StringHttpMessageConverter编码为UTF-8,防止乱码 --><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><!-- 避免IE执行AJAX时,返回JSON出现下载文件 --><bean id="fastJsonHttpMessageConverter"class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=utf-8</value></list></property><!--<property name="serializerFeature"> --><!--这个地方加上这个功能吧,能自己配置一些东西,比如时间的格式化,null输出""等等 --><!--</property> --></bean></mvc:message-converters></mvc:annotation-driven><!-- 当在web.xml 中 DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源 --><mvc:default-servlet-handler/><!-- 静态资源映射 --><mvc:resources mapping="/static/**" location="/static/"/><bean id="fmviewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/><property name="contentType" value="text/html;charset=UTF-8"/><property name="cache" value="true"/><property name="prefix" value=""/><property name="suffix" value=".ftl"/><property name="order" value="1"/></bean><bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><property name="templateLoaderPath" value="/WEB-INF/ftl/"/><property name="freemarkerSettings"><props><prop key="template_update_delay">0</prop><prop key="defaultEncoding">UTF-8</prop><prop key="url_escaping_charset">UTF-8</prop><prop key="locale">zh_CN</prop><prop key="boolean_format">true,false</prop><prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop><prop key="date_format">yyyy-MM-dd</prop><prop key="time_format">HH:mm:ss</prop><prop key="number_format">0.####</prop><prop key="whitespace_stripping">true</prop></props></property></bean><bean id="viewResolver" 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"/><property name="order" value="2"/></bean><!-- 国际化的消息资源文件(本系统中主要用于显示/错误消息定制) --><bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basenames"><list><!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找 --><value>classpath:messages</value></list></property><property name="useCodeAsDefaultMessage" value="false"/><property name="defaultEncoding" value="UTF-8"/><property name="cacheSeconds" value="60"/></bean><!-- 以下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册 --><bean id="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/><!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties --><property name="validationMessageSource" ref="messageSource"/></bean></beans>
application.properties
jdbc.classname=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testmybatisjdbc.username=rootjdbc.password=whmpbx@163.comminConnection=1initConnection=1maxConnection=5
logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 日志文件目录 --><!-- property name="log.path" value="/opt/epp/admin/log/${server.name}" /--><property name="log.path" value="D:/logs/log1" /><!-- action 访问信息log --><appender name="ControllerLoggerFileOut" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/web-controller.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.path}/web-controller.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 100MB --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%date|%thread|%X{invokeNo}|employeNo:%X{jobNumber}|Ip:%X{ip}|User:%X{user}|%level|%logger{0}|%msg%n</pattern></encoder></appender><!-- biz 访问信息log --><appender name="BizAccessLoggerFileOut" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/web-biz.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.path}/web-biz.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 100MB --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%date|%thread|%X{invokeNo}|%level|%logger{0}|%msg%n</pattern></encoder></appender><!-- service访问信息log --><appender name="ServiceLoggerFileOut" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/web-service.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.path}/web-service.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 100MB --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%date|%thread|%X{invokeNo}|%level|%logger{0}|%msg%n</pattern></encoder></appender><!-- 所有Error log --><appender name="ErrorLoggerFileOut" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><file>${log.path}/web-error.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.path}/web-error.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 100MB --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%date [%thread] %-5level %logger{80} - [Ip:%X{ip}|User:%X{user}]%msg%n</pattern></encoder></appender><appender name="ConsoleLoggerStdOut" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%date|%thread|%X{invokeNo}|employeNo:%X{jobNumber}|Ip:%X{ip}|User:%X{user}|%level|%logger{0}|%msg%n</pattern></encoder></appender><logger name="com.yuxi.web.controller" level="DEBUG" additivity="false"><appender-ref ref="ControllerLoggerFileOut" /><appender-ref ref="ConsoleLoggerStdOut" /><appender-ref ref="ErrorLoggerFileOut" /></logger><logger name="com.yuxi.web.service" level="DEBUG" additivity="false"><appender-ref ref="ServiceLoggerFileOut" /><appender-ref ref="ConsoleLoggerStdOut" /><appender-ref ref="ErrorLoggerFileOut" /></logger><logger name="com.yuxi.common" level="DEBUG" additivity="false"><appender-ref ref="ConsoleLoggerStdOut" /><appender-ref ref="ErrorLoggerFileOut" /></logger><logger name="com.yuxi.web.dao" level="DEBUG" additivity="false"><appender-ref ref="ConsoleLoggerStdOut" /><appender-ref ref="ErrorLoggerFileOut" /></logger></configuration>
配置都配置完成后。就是页面了。页面使用的是freemarker。这个贴页面就OK了。。
index.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>test demo</title><meta name="keywords" content="keywords1,keywords2"/><meta name="description" content="description" /><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="imagetoolbar" content="no"/><meta name="apple-mobile-web-app-capable" content="yes"/></head><body><div><a href="save">新增</a><table><tr></tr><#if lists?? &&lists?size gt 0><#list lists as page><tr><td>${page.username}</td><td>${page.userpass}</td><td>${page.useraddress}</td><td><a href="delete?id=${page.id}">删除</a></td></tr></#list></#if></table></div></body></html>
三、注意事项
此处难产了一天,主要是由于晚上部门有个会。现在就来写写吧。
在使用spring mvc中需要注意cotroller的扫描中,如果是spring的单独控制,最好是在applicationContext.xml中先不扫描controller,在spring-servlet中只扫描cotroller。
maven打包中,可能会出现找不到包的情况,此时,需要注意build.xml中的<property
name="dir.compiler.home"
location="."
/>需要把location=“.”修改为location=“..”进行包的下载,然后在修改为原来的值进行打包。
本文详细介绍了如何使用SpringMVC、MyBatis、Druid连接池等技术构建一个企业级Web应用,包括环境搭建、业务代码实现、配置信息详解以及注意事项。涵盖了从Maven项目的多模块构建到业务功能实现,再到Web容器Jetty的配置,以及关键组件的使用和配置。
939

被折叠的 条评论
为什么被折叠?



