一、项目效果展示
1、列表展示 图片:1.jpg ![]() 2、分页功能 图片:2.jpg ![]() 3、提取IP功能 图片:3.jpg ![]() 图片:4.jpg ![]() 4、帮助页面 图片:5.jpg ![]() 二、为什么要选择SpringMVC框架? 京东、珍品网等大型网站都在使用SpringMVC框架,它优点多,主要体现在: 1、简单易用,学习成本低,开发效率高。 2、性能灵活,优于struts。 3、大众框架,遇到困难,网上解决方案众多。 三、SpringMVC框架要点 1、SpringMVC的注解类 @Contorller注解 @Contorller public class IPContorller{ ... }@RequestMapping注解,org.springframework.web.servlet.DispatcherServlet找到控制器并把请求分发到控制器: @Contorller @RequestMapping("/ip") public class IPContorller{ @RequestMapping(value="/index",method=RequestMethod.GET) public void index90{ ... } }@Service注解定义业务逻辑类 @Service public class IPServiceImpl implements IIPService{ ... }@Resource注解实现注入 @Service public class IPServiceImpl implements IIPService{ @Resource IIpDao dao; ... }四、为什么要用Mybatis框架? 1、简单易用,会SQL语句就会用Mybatis 2、灵活,完全手写SQL语句,可控性强 3、SQL和代码分离,提高了可维护性 4、大众框架,遇到问题网上有很多解决方案。 看个简单的例子: <?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="book.map.User"> <select id="findById" parameterType="int" resultType="book.pojo.User"> select * from User where id = #{id} </select> </mapper>五、Mybatis开发流程 Mybatis开发采用DAO层映射机制,只需要简单三步: 1、定义Mybatis配置文件 2、定义DAO类 3、定义XML格式的SQL-Mapper文件 六、SpringMVC与Mybatis框架整合过程中,需要重点注意3个配置文件 1、定义web.xml 2、定义springmvc.xml 3、定义applicationContext.xml 七、初始化项目 1、配置好maven、SpringMVC 2、建立项目目录文件如下: 图片:6.jpg ![]() 图片:7.jpg ![]() 3、建立数据表如下: 图片:8.jpg ![]() 八、关键代码 package com.demo.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.demo.common.PageParam; import com.demo.service.TableIpService; @Controller public class IndexController { @Resource TableIpService service; @RequestMapping(value = "index") public String helloWorld(HttpServletRequest request){ String currPageStr = request.getParameter("page"); int currPage = 1; try { currPage = Integer.parseInt(currPageStr); } catch (Exception e) { } // 获取总记录数 int rowCount = service.getRowCount(); PageParam pageParam = new PageParam(); pageParam.setRowCount(rowCount); if (pageParam.getTotalPage() < currPage) { currPage = pageParam.getTotalPage(); } pageParam.setCurrPage(currPage); pageParam = service.getIpListByPage(pageParam); request.setAttribute("pageParam", pageParam); return "index"; } } package com.demo.dao; import java.util.List; import java.util.Map; import org.springframework.stereotype.Repository; import com.demo.entity.TableIp; @Repository public interface ITableIpDao { int getRowCount(); List<TableIp> selectByParams(Map<String, Object> params); List<TableIp> fetchByParams(Map<String, Object> params); } package com.demo.service; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.demo.common.PageParam; import com.demo.dao.ITableIpDao; import com.demo.entity.TableIp; @Service public class TableIpService { @Resource ITableIpDao dao ; public int getRowCount() { return dao.getRowCount(); } public PageParam getIpListByPage(PageParam pageParam) { int currPage = pageParam.getCurrPage(); // limit offset, size int offset = (currPage - 1) * PageParam.pageSize ; int size = PageParam.pageSize; Map<String, Object> params = new HashMap<String, Object>(); params.put("offset", offset); params.put("size", size); List<TableIp> ipList = dao.selectByParams(params); pageParam.setData(ipList); return pageParam; } public String printIp(String number, String country, String isp) { int size = 100; try { size = Integer.parseInt(number); } catch (Exception e) { } Map<String, Object> params = new HashMap<String, Object>(); params.put("size", size); params.put("country", country); params.put("isp", isp); List<TableIp> ipList = dao.fetchByParams(params); StringBuilder sBuilder = new StringBuilder(); for (TableIp tableIp : ipList) { sBuilder.append(tableIp.getIp()).append(":").append(tableIp.getPort()).append(",").append(tableIp.getCountry()).append(",").append(tableIp.getIsp()); sBuilder.append("\r\n"); } return sBuilder.toString(); } } package com.demo.controller; import java.io.IOException; import java.io.PrintWriter; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.demo.service.TableIpService; @Controller public class FetchController { @Resource TableIpService service; @RequestMapping(value = "fetch") public String helloWorld(){ return "fetch"; } @RequestMapping(value = "get", method = RequestMethod.POST) public void get(HttpServletRequest request, HttpServletResponse response){ String number = request.getParameter("num"); String country = request.getParameter("country"); String isp = request.getParameter("isp"); String txt = service.printIp(number, country, isp); PrintWriter writer; try { response.setCharacterEncoding("GBK"); writer = response.getWriter(); writer.write(txt); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }九、关键配置文件 1、tableIpMapper.xml <?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"> <!-- namespace必须指向Dao接口 --> <mapper namespace="com.demo.dao.ITableIpDao"> <select id="getRowCount" resultType="int"> select count(*) from table_ip </select> <select id="selectByParams" resultType="com.demo.entity.TableIp" parameterType="map"> select * from table_ip order by findTime desc limit ${offset}, ${size} </select> <select id="fetchByParams" resultType="com.demo.entity.TableIp" parameterType="map"> select * from table_ip where 1=1 <if test="country != null and country != ''"> and country = '${country}' </if> <if test="isp != null and isp != ''"> and isp = '${isp}' </if> limit ${size} </select> </mapper>2、applicationContext.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:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"> <description>Spring公共配置</description> <!-- 开启定时任务 --> <task:annotation-driven/> <!-- MyBatis配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 显式指定Mapper文件位置 --> <property name="mapperLocations" value="classpath*:/mybatis/*Mapper.xml" /> <!-- mybatis配置文件路径 --> <property name="configLocation" value="classpath:/mybatis/config.xml"/> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <!-- 这个执行器会批量执行更新语句, 还有SIMPLE 和 REUSE --> <constructor-arg index="1" value="BATCH" /> </bean> <!-- 扫描basePackage接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 映射器接口文件的包路径, --> <property name="basePackage" value="com.demo.dao" /> </bean> <!-- 使用annotation定义事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> <!-- 数据源配置, 使用Tomcat JDBC连接池 --> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info --> <property name="maxActive" value="${jdbc.pool.maxActive}" /> <property name="maxIdle" value="${jdbc.pool.maxIdle}" /> <property name="minIdle" value="0" /> <property name="defaultAutoCommit" value="false" /> </bean> <!-- production环境 --> <beans profile="production"> <context:property-placeholder ignore-unresolvable="true" file-encoding="utf-8" location="classpath:config.properties,classpath:jdbc.properties" /> </beans> </beans>jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/ip?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true jdbc.username=root jdbc.password=你的密码 #connection pool settings # maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20个空闲的连接,它们不会被清除,随时处于待命状态 jdbc.pool.maxIdle=20 # maxActive是最大激活连接数,这里取值为190,表示同时最多有190个数据库连接 jdbc.pool.maxActive=190logback.xml <?xml version="1.0" encoding="UTF-8" ?> <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 DEBUG 日志 --> <appender name="file-debug" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY </onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>/export/data/logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="file-info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY </onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>/export/data/logs/info.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="file-error" 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> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>/export/data/logs/error.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 很多人使用Mybatis的时候,控制台不能输出SQL语句,造成调试困难。只需要让DAO层的日志级别调整为DEBUG就可以了 --> <logger name="com.dao" level="DEBUG" /> <!-- 指定项目可输出的最低级别日志 --> <root level="INFO"> <appender-ref ref="console" /> <appender-ref ref="file-debug" /> <appender-ref ref="file-info" /> <appender-ref ref="file-error" /> </root> </configuration>十、项目工程源码 http://share.weiyun.com/39856d14f5580b2c6bba8371571a4a8c |
|
|
jkxqj
发布于2015-11-30 23:13
沙发F
沙发~!
|
|
|
qq_amjdVpG14982
发布于2017-07-30 13:55
板凳F
大佬 链接失效了
|
|
|