一、概念
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
如果还有一些问题可以提问,我会尽力帮大家查找与解决,一起学习~~~