springmvc+mybatis+Hazelcast试验

可能不够详细,见谅

1.创建项目,下载jar包

jar包下载地址  链接:https://pan.baidu.com/s/1cgsPYD8KL25-eeBfRgBQGw 密码:a8uq

2.整合springmvc+mybatis

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="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">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 字符编码过滤器  -->
	<filter>  
		<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>  
		<url-pattern>/*</url-pattern>  
	</filter-mapping>

  <!-- springmvc前端控制器  -->
  <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:applicationContext.xml</param-value>
      </init-param>
      <!-- 表示servlet随服务启动 -->
      <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <!--Servlet拦截方式
          方式一:*.action,访问以.action结尾由DispatcherServlet进行解析
          方式二:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析。
          使用此方式可以实现RESTful风格的url
          方式三:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
          仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错
        -->
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
  <!-- Hazelcast配置 -->
	<listener> 
		<listener-class>com.hazelcastConfig.HazelcastConfigInit</listener-class> 
	</listener>
</web-app>

创建数据库连接文件db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssh?serverTimezone=GMT%2b8
jdbc.username=root
jdbc.password=123456
initialSize=0
maxActive=20
maxIdle=20
minIdle=1
maxWait=60000

创建mybatis配置文件sqlMapConfig.xml,com\dao\UserMapper.xml的配置后面说

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!-- 全局setting配置,根据需要添加 -->
	<settings>  
        <!-- 打印查询语句 -->  
        <setting name="logImpl" value="STDOUT_LOGGING" />  
    </settings>
    <!-- 配置别名 -->
    <!--<typeAliases>
         批量扫描别名 
        <package name="joanna.yan.ssm.po"/>
    </typeAliases>

    --><!-- 配置mapper
         由于使用spring和mybatis的整合包进行mapper扫描,这里不需要配置了。
         但是必须遵循:mapper.xml和mapper.java文件同名且在一个目录
     -->
    <!-- <mappers></mappers> -->
    <mappers>
    	<mapper resource="com\dao\UserMapper.xml"/>
    </mappers>
    
 </configuration>

创建applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context" 
	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:p="http://www.springframework.org/schema/p" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
    xmlns:cache="http://www.springframework.org/schema/cache"  
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context.xsd  
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
    http://www.springframework.org/schema/tx  
    http://www.springframework.org/schema/tx/spring-tx.xsd  
    http://www.springframework.org/schema/jdbc  
    http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd  
    http://www.springframework.org/schema/cache  
    http://www.springframework.org/schema/cache/spring-cache-4.3.xsd  
    http://www.springframework.org/schema/aop  
    http://www.springframework.org/schema/aop/spring-aop.xsd  
    http://www.springframework.org/schema/util  
    http://www.springframework.org/schema/util/spring-util.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">  
  
    <!-- 自动扫描web包 ,将带有注解的类 纳入spring容器管理 -->  
    <context:component-scan base-package="com"></context:component-scan>
    
    <!-- 加载db.properties文件中的内容,db.properties文件中的key命名要有一定的特殊规则 -->
    <context:property-placeholder location="classpath:db.properties"/>
    
    <!-- 加载db.properties中的数据库参数 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.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>  
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="false">
        <!-- 注入datasource,给sessionfactoryBean内setdatasource提供数据源 -->
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:sqlMapConfig.xml" />
    </bean>  
    
    <!-- mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开  -->
        <property name="basePackage" value="com.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
    </bean>
    
    <!-- 配置Spring声明式事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean> 
    <!-- 配置事务事务属性 -->
    <!-- CountryServiceImpl中原有方法isboolean,报错Could not obtain transaction-synchronized Session for current thread
    	后因<tx:method name="find*" read-only="true"/>改方法名为findisboolean
    	百度原因使用了sessionFactory.getCurrentSession() -->
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/><!-- 要求 -->
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> <!-- 支持,如果没有就算了 -->
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!-- 配置事务切点,并把切点和事务属性关联起来 -->
    <aop:config>
        <aop:pointcut expression="execution(* com.service.*.*(..))" id="txPointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
	
	<!-- 配置视图解析器 
         解析jsp视图,默认使用jstl标签,所有classpath下得有jstl的包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置jsp路径的前缀  这里前缀被我注释掉了,所以默认路径为WebRoot
        <property name="prefix" value="/WEB-INF/jsp/"/>-->
        <!--配置jsp路径的后缀  -->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 全局异常配置 start -->     
     <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">     
         <property name="exceptionMappings">     
             <props>     
                 <prop key="java.lang.Exception">errors/error</prop>     
                 <prop key="java.lang.Throwable">errors/err</prop>     
             </props>     
         </property>     
         <property name="statusCodes">     
             <props>     
                 <prop key="errors/error">500</prop>     
                 <prop key="errors/404">404</prop>     
             </props>     
         </property>     
         <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->     
         <property name="warnLogCategory" value="WARN"></property>     
         <!-- 默认错误页面,当找不到上面mappings中指定的异常相应视图时,使用本默认配置 -->     
         <property name="defaultErrorView" value="errors/error"></property>     
         <!-- 默认HTTP状态码 -->     
         <property name="defaultStatusCode" value="500"></property>     
     </bean>
     <!-- 全局异常配置 end -->
     
     <!-- 拦截器 -->
     <mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/getAllUser.action"/>
			<bean class="com.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
     </mvc:interceptors>
     <!-- 拦截器end -->
</beans>

这里面有个自定义的过滤器拦截/getAllUser.action链接

package com.interceptor;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

	//afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
	
	//postHandle在业务处理器处理请求执行完成后,生成视图之前执行;
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
	
	//preHandle在业务处理器处理请求之前被调用;
	@SuppressWarnings("unused")
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		// TODO Auto-generated method stub
		//arg0.setAttribute("aaa", 1111);
		System.out.println("-----" + arg0.getParameter("aaa"));
		arg0.setAttribute("aaa", 1111);
		System.out.println("进入拦截器");
		if(false) {
			//跳转
			fowardMessage(arg0, arg1);
			return false;
		}
		//放行
		return true;
	}
	
	/**
     * 跳转页面
     * @param : menuUrl
     * @throws IOException 
     * @throws ServletException 
     */
    private void fowardMessage(HttpServletRequest request,HttpServletResponse response)
    		throws ServletException, IOException{

        RequestDispatcher rd = request.getRequestDispatcher("/getUserByConditions.action");
        rd.forward(request, response);

    }

}

配置数据库处理层UserDao

package com.dao;

import java.util.List;

import com.mybatis.po.User;

public interface UserDao {
	public List<User> getAllUser();

	public void addUser(User user);
	
	public void deleteUser(long id);
	
	public void updateUser(User user);
	
	public List<User> getUserByConditions(User user);
}

UserMapper.xml,namespace="com.dao.UserDao"

<?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.dao.UserDao">
  <resultMap id="BaseResultMap" type="com.mybatis.po.User">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
  </resultMap>
  <sql id="Base_Column_List">
    id, username, password, nickname
  </sql>
  <select id="getAllUser" parameterType="com.mybatis.po.User" resultMap="BaseResultMap">
  	select <include refid="Base_Column_List"></include> from user 
  </select>
  
  <!-- 不返回参数
  <insert id="addUser" parameterType="com.mybatis.po.User">
    insert into user (username, password, 
      nickname)
    values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{nickname,jdbcType=VARCHAR})
  </insert> -->
  
  <!-- 返回id -->
  <insert id="addUser" parameterType="com.mybatis.po.User" useGeneratedKeys="true" keyProperty="id">
  	<!-- <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
         SELECT LAST_INSERT_ID()
     </selectKey> -->
    insert into user ( username, password, 
      nickname)
    values ( #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{nickname,jdbcType=VARCHAR})
  </insert>
  
  <select id="getUserByConditions" parameterType="com.mybatis.po.User" resultMap="BaseResultMap">
  	select <include refid="Base_Column_List"></include> from user 
  	where 1 = 1
		<choose>
			<when test="id != null">
				and id = #{id}
			</when>
			<otherwise>
				<if test="username != null">
	  				and username like '%${username}%'
	  			</if>
	  			<if test="nickname != null">
	  				and nickname like '%${nickname}%'
	  			</if>
			</otherwise>
		</choose>
  </select>
  
  <update id="updateUser" parameterType="com.mybatis.po.User">
    update user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  
  <delete id="deleteUser" parameterType="java.lang.Long">
    delete from user
    where id = #{id,jdbcType=BIGINT}
  </delete>
</mapper>

注意:UserDao中的方法名可以通过与UserMapper.xml中sql语句的id直接调用sql

UserService省略

UserServiceImpl

package com.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dao.UserDao;
import com.mybatis.po.User;

@Service(value="userService")
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao userDao;

	public List<User> getAllUser() {
		// TODO Auto-generated method stub
		return userDao.getAllUser();
	}

	public void addUser(User user) {
		// TODO Auto-generated method stub
		userDao.addUser(user);
		//获取user自增长id
		System.out.println("UserServiceImpl---" + user.getId());
	}

	public void deleteUser(long id) {
		// TODO Auto-generated method stub
		userDao.deleteUser(id);
	}

	public List<User> getUserByConditions(User user) {
		// TODO Auto-generated method stub
		return userDao.getUserByConditions(user);
	}

	public void updateUser(User user) {
		// TODO Auto-generated method stub
		userDao.updateUser(user);
	}

}

注意user表的id为自增长,addUser方法可以通过mapper.xml中的

<insert id="addUser" parameterType="com.mybatis.po.User" useGeneratedKeys="true" keyProperty="id">

获取自增长的id

UserController,这里粘贴一部分

package com.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 org.springframework.web.servlet.ModelAndView;

import com.hazelcastConfig.HazelcastConfigMap;
import com.mybatis.po.User;
import com.service.UserService;

@Controller
public class UserController {
	@Resource
	private UserService userService;
	
	@RequestMapping(value="/getAllUser")
	public ModelAndView getAllUser(HttpServletRequest req) {
		//试验拦截器传参
		System.out.println(req.getAttribute("aaa"));
		ModelAndView mv = new ModelAndView("/user/result");
		List<User> userlist = userService.getAllUser();
		mv.addObject("userlist", userlist);
		return mv;
	}
}

ModelAndView mv = new ModelAndView("/user/result");

这句话是说访问的页面,由于applicationContext.xml中配置了

<!-- 配置视图解析器 
         解析jsp视图,默认使用jstl标签,所有classpath下得有jstl的包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置jsp路径的前缀  
        <property name="prefix" value="/WEB-INF/jsp/"/>-->
        <!--配置jsp路径的后缀  -->
        <property name="suffix" value=".jsp"/>
    </bean>

所以"/user/result"的路径为WebRoot/user/result.jsp

下面写一个简单的ajax实现搜索框自动提示

参考地址:https://blog.csdn.net/freepart/article/details/71056924

前台看上面的参考地址,后台

@RequestMapping(value="/ajax",method=RequestMethod.POST,produces="text/html;charset=UTF-8")
	public List<User> ajax(HttpServletRequest req, HttpServletResponse resp) {
		String username = req.getParameter("username");
		User user = new User();
		user.setUsername(username);
		List<User> userlist = userService.getUserByConditions(user);
		return userlist;
	}

3.配置Hazelcast

创建hazelcast.xml,参考地址

https://my.oschina.net/chkui/blog/732408

https://blog.csdn.net/frankcheng5143/article/details/48708899

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast
	xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.6.xsd"
	xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<group>
		<name>default</name>
		<password>default</password>
	</group>
	<management-center enabled="false">http://localhost:8080/mancenter
	</management-center>
	<network>
		<port auto-increment="true" port-count="110">7701</port>
		<outbound-ports>
			<ports>0</ports>
		</outbound-ports>
		<join>
			<multicast enabled="true">
				<multicast-group>224.2.2.3</multicast-group>
				<multicast-port>54327</multicast-port>
			</multicast>
			<!-- TCP/IP协议 -->
			<tcp-ip enabled="false">
			</tcp-ip>
		</join>
	</network>
	<partition-group enabled="false" />
	<executor-service name="default">
		<pool-size>16</pool-size>
		<queue-capacity>0</queue-capacity>
	</executor-service>
	<map name="demo.config">
		<backup-count>2</backup-count>
		<time-to-live-seconds>604800</time-to-live-seconds>
		<max-idle-seconds>1800</max-idle-seconds>
		<eviction-policy>LFU</eviction-policy>
		<max-size policy="USED_HEAP_SIZE ">20</max-size>
		<eviction-percentage>25</eviction-percentage>
		<merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy
		</merge-policy>
		<entry-listeners>
			<entry-listener>com.palm.vert.cluster.listener.ClusterCacheListener</entry-listener>
		</entry-listeners>
	</map>
</hazelcast>

多个服务器hazelcast配置,可以参考

<network>
    ...
    <join>
        <multicast enabled="false">
        </multicast>
        <tcp-ip enabled="true">
            <member>machine1</member>
            <member>machine2</member>
            <member>machine3:5799</member>
            <member>192.168.1.0-7</member>
            <member>192.168.1.21</member>
        </tcp-ip>
        ...
    </join>
    ...
</network>

web.xml中配置了


<!-- Hazelcast配置 -->
	<listener> 
		<listener-class>com.hazelcastConfig.HazelcastConfigInit</listener-class> 
	</listener>

意为启动时加载HazelcastConfigInit

package com.hazelcastConfig;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class HazelcastConfigInit implements ServletContextListener {

	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		//初始化Hazelcast
		new HazelcastConfigMap();
	}

}

HazelcastConfigMap

package com.hazelcastConfig;


import java.util.HashMap;
import java.util.Map;


import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;


public class HazelcastConfigMap {
	public static Map<String, String> map = new HashMap<String, String>();
	public HazelcastConfigMap() {
		HazelcastInstance instance = Hazelcast.newHazelcastInstance();
		map = instance.getMap("MyMap");
	}
	
	public static void update(String key,String value) {
		map.put(key, value);
	}
	
	public static String get(String key) {
		return map.get(key);
	}
}

这样就可以在项目中使用了

HazelcastConfigMap.update("aaa", "bbb")

HazelcastConfigMap.get("aaa")

我的试验是在本地启动了2个tomcat,项目一样,在1中update,2中可以通过get获取1中的值

参考地址:https://my.oschina.net/chkui/blog/732408

                https://blog.csdn.net/freepart/article/details/71056924

                https://blog.csdn.net/qq_37171353/article/details/77986422

                https://blog.csdn.net/luxun2014/article/details/43538281

                https://blog.csdn.net/frankcheng5143/article/details/48708899

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值