一、概念
ssm就是spring+springmvc+mybatis三個框架的簡稱。是標准的mvc模式。將整個系統分解成視圖層(也可以叫表現層,View層),控制層(controller層),模型層(Model層,里面包含service、model和dao)
springmvc:負責請求的轉發和視圖的管理。
spring:我們平時開發接觸最多的估計就是IOC容器,它可以裝載bean(也就是我們Java中的類,當然也包括service dao里面的),有了這個機制,我們就不用在每次使用這個類的時候為它初始化,很少看到關鍵字new。另外spring的aop,事務管理等等都是我們經常用到的。
mybatis:是一個持久層框架,消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。mybatis是對jdbc的封裝,它讓數據庫底層操作變的透明。mybatis的操作都是圍繞一個sqlSessionFactory實例展開的。mybatis通過配置文件關聯到各命名空間的Mapper文件,Mapper文件中配置了每個dao下方法對數據庫進行的sql語句映射。在每次與數據庫交互時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令。
原理:
客戶端發送請求由DispacherServlet分發器接收,DispacherServlet分發器查詢HanderMapping,找到處理請求的Controller,Controller調用業務邏輯處理后,返回ModelAndView,視圖解析器找到ModelAndView指定的視圖,DispacherServlet負責將結果顯示到客戶端
二、整合步驟
創建maven項目:http://www.cnblogs.com/longLifeFrog/articles/8583811.html。
框架版本:
配置文件:
log4j.properties:http://www.cnblogs.com/longLifeFrog/articles/7956214.html
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
#初始連接數
initialSize=0
#最大連接數
maxActive=20
#最大空閑
maxIdle=20
#最小空閑
minIdle=1
#最長等待時間
maxWait=60000
spring-mvc.xml
spring-mybatis.xml
POM文件需要引入的jar包:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> </dependency> <!-- spring核心包:core、web、oxm、tx、jdbc、webmvc、aop、spring-context-support、test --> <!-- 核心包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!-- spring dao層 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- web依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 映射支持依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis/spring包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <!-- 導入Mysql數據庫鏈接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <!-- JSTL標簽類 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 日志文件管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 格式化對象,方便輸出日志 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <!-- 過期jar包,使用下面的jar包 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!-- jackson jar包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.0</version> </dependency> <!-- 上傳組件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.6</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4</version> </dependency> <!-- freemarker依賴 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> </dependencies>
spring和mybatis的整合:
spring-mybatis.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 自動掃描 --> <context:component-scan base-package="com.cn.hnust"/> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 連接屬性 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="initialSize" value="${initialSize}"/> <property name="maxActive" value="${maxActive}"/> <property name="maxIdle" value="${maxIdle}"/> <property name="minIdle" value="${minIdle}"/> <property name="maxWait" value="${maxWait}"/> </bean> <!-- spring和mybatis的整合:掃描mapper.xml文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自動掃描,mapper.xml文件 --> <property name="mapperLocations" value="classpath:com/cn/hnust/mapping/*.xml"/> </bean> <!-- Dao接口所在包名,spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.cn.hnust.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> </beans>
整合springmvc(自動掃描控制器,視圖模式,注解的啟動):
我用了freemarker代替jsp頁面,所以視圖解析器的bean比較長,如果不用就把list標簽里面freemarker的bean去掉。
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 自動掃描該包,使spring認為這個包下面使用了@controller的類是控制器 --> <context:component-scan base-package="com.cn.hnust.controller"/> <!-- 對靜態資源文件的訪問 --> <mvc:annotation-driven /> <mvc:resources location="/WEB-INF/sources/css/" mapping="/sources/css/**"/> <mvc:resources location="/WEB-INF/sources/js/" mapping="/sources/js/**"/> <!-- 避免IE執行AJAX時,返回json執行下載文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 啟動springMVC的注解功能, 完成請求和注解的pojo映射--> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON轉換器 --> </list> </property> </bean> <!-- freemarker配置 --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> <property name="defaultEncoding" value="utf-8"/> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">10</prop> <prop key="locale">zh_CN</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="date_format">yyyy-MM-dd</prop> <prop key="number_format">#.##</prop> </props> </property> </bean> <!-- 定義跳轉文件的前后綴,視圖模式配置 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="ignoreAcceptHeader" value="true" /> <property name="defaultContentType" value="text/html" /> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xls" value="application/vnd.ms-excel" /> <entry key="xlsx" value="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> <entry key="pdf" value="application/pdf" /> </map> </property> <property name="favorParameter" value="false" /> <property name="viewResolvers"> <list> <!-- 配置freeMarker視圖解析器 --> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true" /> <property name="prefix" value="" /><!-- 上面已經配了,這里就不用配啦 --> <property name="suffix" value=".ftl" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" /> <property name="allowSessionOverride" value="true" /> <property name="allowRequestOverride" value="true" /> <property name="exposeSpringMacroHelpers" value="false" /> <property name="exposeRequestAttributes" value="true" /> <property name="exposeSessionAttributes" value="true" /> <property name="requestContextAttribute" value="request" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 這里的配置我的理解是自動給后面action的方法return的字符串加上前綴和后綴,變成一個 可用的url地址 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </list> </property> </bean> <!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當然如果不配,那么配置文件中也不必引入上傳組件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默認編碼 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 內存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> </beans>
配置web.xml文件:
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <!-- 編碼過濾器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止Spring內存溢出監聽器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>
到這整合就完成了。后面是實測部分。
用上面的框架來寫一個簡單的md5加密網站,類似https://md5jiami.51240.com/
項目結構:
首先看數據庫,來確定entity實體類的屬性
content字段代表明文。剩下的字段一個是id,一個是16位密文,一個是32位密文。
我們的實體類md5Pwd(由於是生成的,首字母是小寫,不過問題不是很大,后面自行改成大寫吧)
package com.cn.hnust.entity; public class md5Pwd { private Integer id; private String sixteenBits; private String thirtytwoBits; private String content; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getSixteenBits() { return sixteenBits; } public void setSixteenBits(String sixteenBits) { this.sixteenBits = sixteenBits == null ? null : sixteenBits.trim(); } public String getThirtytwoBits() { return thirtytwoBits; } public void setThirtytwoBits(String thirtytwoBits) { this.thirtytwoBits = thirtytwoBits == null ? null : thirtytwoBits.trim(); } public String getContent() { return content; } public void setContent(String content) { this.content = content == null ? null : content.trim(); } }
然后是dao,一個dao對應一個mapper文件里面的命名空間:
package com.cn.hnust.dao; import org.springframework.stereotype.Repository; import com.cn.hnust.entity.md5Pwd; @Repository public interface IMd5PwdDao { int deleteByPrimaryKey(Integer id); int insert(md5Pwd record); int insertSelective(md5Pwd record); md5Pwd selectByPrimaryKey(Integer id); md5Pwd selectByContent(String content); int updateByPrimaryKeySelective(md5Pwd record); int updateByPrimaryKey(md5Pwd record); }
接着是mybatis的sql映射文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cn.hnust.dao.IMd5PwdDao"> <resultMap id="Md5ResultMap" type="com.cn.hnust.entity.md5Pwd"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="sixteen_bits" jdbcType="VARCHAR" property="sixteenBits" /> <result column="thirtytwo_bits" jdbcType="VARCHAR" property="thirtytwoBits" /> <result column="content" jdbcType="VARCHAR" property="content" /> </resultMap> <sql id="Base_Column_List"> id, sixteen_bits, thirtytwo_bits, content </sql> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="Md5ResultMap"> select <include refid="Base_Column_List" /> from md5table where id = #{id,jdbcType=INTEGER} </select> <select id="selectByContent" parameterType="java.lang.String" resultMap="Md5ResultMap"> select <include refid="Base_Column_List" /> from md5table where content = #{content,jdbcType=VARCHAR} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from md5table where id = #{id,jdbcType=INTEGER} </delete> <insert id="insert" parameterType="com.cn.hnust.entity.md5Pwd"> insert into md5table (id, sixteen_bits, thirtytwo_bits, content) values (#{id,jdbcType=INTEGER}, #{sixteenBits,jdbcType=VARCHAR}, #{thirtytwoBits,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" parameterType="com.cn.hnust.entity.md5Pwd"> insert into md5table <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="sixteenBits != null"> sixteen_bits, </if> <if test="thirtytwoBits != null"> thirtytwo_bits, </if> <if test="content != null"> content, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id,jdbcType=INTEGER}, </if> <if test="sixteenBits != null"> #{sixteenBits,jdbcType=VARCHAR}, </if> <if test="thirtytwoBits != null"> #{thirtytwoBits,jdbcType=VARCHAR}, </if> <if test="content != null"> #{content,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.cn.hnust.entity.md5Pwd"> update md5table <set> <if test="sixteenBits != null"> sixteen_bits = #{sixteenBits,jdbcType=VARCHAR}, </if> <if test="thirtytwoBits != null"> thirtytwo_bits = #{thirtytwoBits,jdbcType=VARCHAR}, </if> <if test="content != null"> content = #{content,jdbcType=VARCHAR}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.cn.hnust.entity.md5Pwd"> update md5table set sixteen_bits = #{sixteenBits,jdbcType=VARCHAR}, thirtytwo_bits = #{thirtytwoBits,jdbcType=VARCHAR}, content = #{content,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} </update> </mapper>
接着是寫執行主要邏輯的model類:
package com.cn.hnust.model; import javax.annotation.Resource; import org.springframework.stereotype.Component; import com.cn.hnust.dao.IMd5PwdDao; import com.cn.hnust.entity.md5Pwd; import com.cn.hnust.util.BusinessException; import com.cn.hnust.util.ErrorCode; import com.cn.hnust.util.Md5Utils; @Component public class Md5PwdModel { @Resource private IMd5PwdDao md5PwdDao; public md5Pwd listByContent(String content){ md5Pwd md5=null; if(content == null || content.equals("")){ throw new BusinessException(ErrorCode.NULL_ERR); } md5=md5PwdDao.selectByContent(content); if(md5==null){ md5Pwd newMd5=new md5Pwd(); newMd5.setThirtytwoBits(Md5Utils.getMD5_32bits(content)); newMd5.setSixteenBits(Md5Utils.getMD5_16bits(content)); newMd5.setContent(content); Integer count=md5PwdDao.insertSelective(newMd5); if(count != 1){ throw new BusinessException(ErrorCode.SYS_ERR); } md5=newMd5; } return md5; } public Integer insert(md5Pwd md5){ return md5PwdDao.insertSelective(md5); } }
這里有用到工具類Md5Utils:
package com.cn.hnust.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5Utils { public static String getMD5_16bits(String str) { return getMD5_32bits(str).substring(8, 24); } public static String getMD5_32bits(String str) { if(str == null || str.equals("")){ throw new BusinessException("md5加密內容不能為空"); } MessageDigest md=null; try { md = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md.digest(str.getBytes()); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } str = hexValue.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return str; } }
錯誤信息的枚舉類和BusinessException類:
package com.cn.hnust.util; public enum ErrorCode { SYS_ERR("0000","系統錯誤,請聯系管理員"), NULL_ERR("0001","不能為空"), UNKNOWN_ERROR("0002","未知異常"); private String value; private String desc; private ErrorCode(String value, String desc) { this.value = value; this.desc = desc; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "["+this.value+"]"+this.desc; } }
package com.cn.hnust.util; public class BusinessException extends RuntimeException{ /** * */ private static final long serialVersionUID = 8244909942447978793L; private String code; private String msg; public BusinessException(ErrorCode obj){ super(obj.toString()); msg=obj.getDesc(); code=obj.getValue(); } public BusinessException(String msg){ this.msg=msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
接着是要寫處理model類拋出異常的service層(接口及其實現類):
package com.cn.hnust.service; import com.cn.hnust.entity.md5Pwd; public interface IMd5Service { public md5Pwd list(String content); public Integer insert(md5Pwd md5); }
package com.cn.hnust.impl; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import com.cn.hnust.entity.md5Pwd; import com.cn.hnust.model.Md5PwdModel; import com.cn.hnust.service.IMd5Service; import com.cn.hnust.util.BusinessException; @Service("md5PwdService") public class Md5PwdServiceImpl implements IMd5Service{ private Logger logger=Logger.getLogger(Md5PwdServiceImpl.class); @Resource private Md5PwdModel md5PwdModel; @Override public md5Pwd list(String content) { md5Pwd md5=null; try{ md5=md5PwdModel.listByContent(content); }catch(BusinessException be){ logger.error("錯誤代碼:"+be.getCode()+","+be.getMsg(),be); }catch (Exception e) { logger.error(e.getMessage(), e); } return md5; } @Override public Integer insert(md5Pwd md5) { return md5PwdModel.insert(md5); } }
接着是controller(主要用來接收參數,處理參數,轉發頁面或者重定向):
package com.cn.hnust.controller; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.cn.hnust.entity.md5Pwd; import com.cn.hnust.service.IMd5Service; @Controller @RequestMapping(value="/md5") public class Md5Controller { @Resource private IMd5Service md5Service; @RequestMapping(value="/list", method ={RequestMethod.POST}) public @ResponseBody md5Pwd list(HttpServletRequest request,Map<String,Object> model){ String content=request.getParameter("content"); md5Pwd md5=md5Service.list(content); return md5; } @RequestMapping(value="/index", method ={RequestMethod.GET}) public String toIndex(HttpServletRequest request,Map<String,Object> model){ return "demo"; } }
@ResponseBody是將結果變成json返回。
然后是頁面:
<!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>md5加密</title> <script type="text/javascript" src="../sources/js/jquery-1.4.2.min.js"></script> <link rel="stylesheet" type="text/css" href="../sources/css/styles.css" /> <script type="text/javascript" src="../sources/js/script.js"></script> </head> <body> <div id="carbonForm"> <h1>md5加密</h1> <form method="get" id="signupForm"> <div class="fieldContainer"> <div class="formRow"> <div class="label"> <label for="name">明文:</label> </div> <div class="field"> <input type="text" name="content" id="content" /> </div> </div> <div class="formRow"> <div class="label"> <label for="email">密文16位:</label> </div> <div class="field"> <span class="span" name="sixteenBits" id="sixteenBits" ></span> </div> </div> <div class="formRow"> <div class="label"> <label for="email">密文32位:</label> </div> <div class="field"> <span class="span" name="thirtytwoBits" id="thirtytwoBits" ></span> </div> </div> </div> <!-- Closing fieldContainer --> <div class="signupButton"> <input type="button" name="submit" id="submit" value="Signup" /> </div> </form> </div> <style> .span{ line-height: 35px } </style> <script> $(function(){ //1k67u85916.51mypc.cn:33579 var prefixUrl="localhost:8081"; $("#submit").click(function(){ $.ajax({ type:"post", data:$("#signupForm").serialize(), url:"http://"+prefixUrl+"/storm/md5/list", dataType:"json", cache:false, success:function(data){ $("#thirtytwoBits").text(data.thirtytwoBits) $("#sixteenBits").text(data.sixteenBits) } }) }) }) </script> </body> </html>
最后是啟動項目。
我是用jetty啟動(右鍵項目debug as ->maven build->輸入jetty:run),因此要在pom下面修改這段:
<build> <finalName>storm2</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <verbose>true</verbose> <fork>true</fork> <executable>${JAVA8_HOME}/bin/javac</executable> </configuration> </plugin> <!-- 添加此插件以便啟動jetty --> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.3.0.M2</version> <configuration> <webAppConfig> <contextPath>/</contextPath> </webAppConfig> <httpConnector> <port>8081</port> <idleTimeout>10000</idleTimeout> </httpConnector> </configuration> </plugin> </plugins> </build>
也可以不加上面這段,用tomcat啟動(http://www.cnblogs.com/longLifeFrog/articles/8612260.html)。
以下是tomcat運行的結果:
在配置spring對靜態資源訪問過程中遇到的一些問題:
如果控制台輸出[org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/storm/md5/index] in DispatcherServlet with name 'SpringMVC'
那么請在spring-mvc.xml下添加:<mvc:annotation-driven />注解驅動
maven啟動可能會出現Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:http://blog.csdn.net/u011734144/article/details/51894942
源碼地址:https://download.csdn.net/download/u010591472/10297312
Github地址:https://github.com/617355557/homecode
一些其他問題,可以查看這篇文章:http://www.cnblogs.com/longLifeFrog/articles/8977595.html
如果還有一些問題可以提問,我會盡力幫大家查找與解決,一起學習~~~