干货--Redis+Spring+Struts2实现网站计算器应用项目案例
2023-09-14 08:57:27 时间
因为是spring+Struts2一起,所以要改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/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_9" version="2.4"
param-name contextConfigLocation /param-name param-value classpath*:applicationContext*.xml /param-value /context-param !-- 配置spring的上下文临听器: 当应用程序一加载到服务器上时,就会调用这个 ContextLoaderListerner, 这个临听器会读取contextConfigLocation配置的spring配置文件,完成 spring容器的初始化. listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener !-- struts2的前端过滤器 -- filter filter-name struts2 /filter-name filter-class org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter /filter-class /filter filter-mapping filter-name struts2 /filter-name url-pattern /* /url-pattern /filter-mapping
pageEncoding="UTF-8"% !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" html head meta http-equiv="Content-Type" content="text/html; charset=UTF-8" title Insert title here /title style #head { font-family: cursive; font-size: 25px; color: orange; cursor: pointer; #content {height =300px; font-family: cursive; font-size: 20px; .ding { border: 1px solid blue; height: 60px; width: 70px; margin-left: 150px; padding-left10px; float: left; background: #FFF; .ding img { display: inline-block; margin-top: 15px; margin-left: 10px; cursor: pointer; .sding { float: left; margin-top: 16px; font-family: cursive; text-decoration: underline; /style script src="js/jquery-1.11.3.js" /script script type="text/javascript" //当这个页面加载完毕 则给 loginbtn绑定单击事件 $(function() { $.ajax({ type : "POST", url : "User_Find.action", dataType : JSON, success : function(data) { if (data.code == 1) { $("#num").text(data.obj.ding); $("#numcai").text(data.obj.cai); } else { alert(data); function addDing() { $.ajax({ type : "POST", url : "User_Ding.action", dataType : JSON, success : function(data) { if (data.code == 1) { $("#num").text(data.obj.ding) } else { alert(data); function addCai(){ $.ajax({ type:"POST", url:"User_Cai.action", dataType:JSON, success: function(data){ if(data.code==1){ $("#numcai").text(data.obj.cai); }else{ alert(data); /script /head body center div table CELLPADDING="0" border="1px" bordercolor="yellow" height="400px" width="600px" id="head" align="left" height="50px" colspan="3" 年度最热门博客 /th /tr tr id="content" height="200" colspan="3" 都说飞得越高,摔得越惨,但是我想看看我到底会摔得有多惨,落地了,只要没死,那么爬起来,每走一步都是向上! br /br 时间并不会真的帮我们解决什么问题,它只是把原来怎么也想不通的问题,变得不再重要了。 /td /tr td colspan="3" div span 顶 /span img alt="tup" src="images/ding.gif" onclick="addDing()" span id="num" /span /div div span 踩 /span img alt="tup" src="images/cai.gif" onclick="addCai()" span id="numcai" /span /div /td /tr /table /div /center /body
!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" struts !-- 关闭动态方法调用 actionid!方法名.action -- constant name="struts.enable.DynamicMethodInvocation" value="false" / !-- 启用开发模式 -- constant name="struts.devMode" value="true" / !-- action的创建由spring来完成,而不由struts完成. -- constant name="struts.objectFactory" value="spring" / package name="default" namespace="/" extends="json-default" action name="User_*" method="{1}" result name="success" type="json" param name="root" jsonModel /param /result /action /package /struts
再看UserAction之前,我们先看看一个帮助类
package com.yc.utils; import java.io.Serializable; public class JsonModel implements Serializable { private static final long serialVersionUID = -7830500053112045585L; private Integer code; private String message; private Object obj; public Integer getCode() { return code; public void setCode(Integer code) { this.code = code; public String getMessage() { return message; public void setMessage(String message) { this.message = message; public Object getObj() { return obj; public void setObj(Object obj) { this.obj = obj;通过这个帮助类将数据转为JSON数据发给前台,具体看后面的代码
我们连接redis服务都是通过spring来完成的,所以我们看看spring 的配置文件
?xml version="1.0" encoding="UTF-8"? beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" !-- 启用注解解析器 -- context:annotation-config / !-- 因为采用了混合解析方式( 有一部分配置在xml中,有一部分在java类中,所以要让spring的注解解析器去扫描包 -- context:component-scan base-package="com.yc" / !-- 启用aspectj的注解方式的代理 -- aop:aspectj-autoproxy / !-- 创建redis工厂 -- bean id="jedisFactory" property name="hostName" value="localhost" / property name="port" value="6379" / property name="usePool" value="true" / /bean bean id="redisTemplate" property name="connectionFactory" ref="jedisFactory" / property name="keySerializer" bean /property property name="valueSerializer" bean /property /bean bean id="springRedisClientImpl" property name="redisTemplate" ref="redisTemplate" / /bean /beans这样我们就可以来操作redis数据库了
再看看操作redis的帮助类,,它里面封装了我们一些基本的操作redis的方法
package com.yc.redis.spring.clients; import java.util.Set; public interface SpringRedisClient { * @param key * @param value public void setKey( String key, String value); * 根据键取值 * @param key * @return public Object getKey( String key); * 自增 * @param key public void incr( String key); * 在上一个元素的左边存 * @param key * @param value public void lPush( String key, String value); * 查看是否有这个键 * @param key * @return public boolean checkKey( String key); * 按键取 * @param key * @return public Object lIndex( String key); * 求长度 * @param key * @return public Long lLength( String key); * 从上一个元素的左边取值 * @param key * @return public String lPop( String key); * 按正则表达式匹配的键取值 * @param pattern * @return public Set String getKeys( String pattern);看看它的实现,里面通过spring注入了一个RedisTemplate,这在spring的配置文件里面已经注册了,这样就可以访问redis数据库了
package com.yc.redis.spring.clients; import java.io.Serializable; import java.util.Set; import org.springframework.data.redis.core.RedisTemplate; public class SpringRedisClientImpl implements SpringRedisClient,Serializable { private static final long serialVersionUID = -4213002642362857373L; private RedisTemplate redisTemplate; public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; @Override public void setKey(String key, String value) { this.redisTemplate.opsForValue().set(key, value); @Override public Object getKey(String key) { return this.redisTemplate.opsForValue().get(key); @Override public void incr(String key) { this.redisTemplate.opsForValue().increment(key, 1); @Override public void lPush(String key, String value) { this.redisTemplate.opsForList().leftPush(key, value); @Override public boolean checkKey(String key) { return this.redisTemplate.hasKey(key); @Override public Object lIndex(String key) { return this.redisTemplate.opsForList().index(key, 0); @Override public Long lLength(String key) { return this.redisTemplate.opsForList().size(key); @Override public String lPop(String key) { return (String) this.redisTemplate.opsForList().leftPop(key); @Override public Set String getKeys(String pattern) { return this.redisTemplate.keys(pattern);首先看看业务层,定义了三个接口方法,分别是顶,踩和刷新时查找顶和踩的数量
package com.yc.service; public interface UserService { public String Ding(); public String Cai() ; public String[] Find() ;下面看它的实现类
package com.yc.service.impl; import java.io.Serializable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import com.yc.redis.spring.clients.SpringRedisClientImpl; import com.yc.service.UserService; import redis.clients.jedis.Jedis; @Service("userServiceImpl") public class UserServiceImpl implements UserService ,Serializable { private static final long serialVersionUID = 1304876423677235894L; @Autowired private SpringRedisClientImpl springRedisClientImpl;//通过spring注入 @Override public String Ding() { springRedisClientImpl.incr("User:ding"); String num=(String) springRedisClientImpl.getKey("User:ding"); return num;
public SpringRedisClientImpl getSpringRedisClientImpl() { return springRedisClientImpl;
public void setSpringRedisClientImpl(SpringRedisClientImpl springRedisClientImpl) { this.springRedisClientImpl = springRedisClientImpl; @Override public String Cai() { springRedisClientImpl.incr("User:cai"); String num=(String) springRedisClientImpl.getKey("User:cai"); return num; @Override public String[] Find() { String s[]=new String[2]; s[0]= (String) springRedisClientImpl.getKey("User:ding"); s[1]= (String) springRedisClientImpl.getKey("User:cai"); return s;最后大家可以看UserAction类了
package com.yc.web.actions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport; import com.yc.beans.User; import com.yc.service.UserService; import com.yc.service.impl.UserServiceImpl; import com.yc.utils.JsonModel; import com.yc.utils.JsonModel; import redis.clients.jedis.Jedis; @Controller("userAction") public class UserAction extends ActionSupport { private static final long serialVersionUID = 1825223373127715747L; private JsonModel jsonModel = new JsonModel(); @Autowired private UserServiceImpl userServiceImpl;这样所有的代码就都已经分析完了,搭建好redis服务后,就可以跑了,
整个项目的代码有需要的朋友可以下载
http://download.csdn.net/detail/tanggao1314/9487851
Struts2+Spring+Hibernate整合步骤 Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建这个框架的经验总结。 本方案采用自底向上:Hibernate Spring Struts2的方式进行整合。具体步骤如下: 1.通过MyEclipse向导,导入实现Hibernate3.2功能:生成会话工厂和hibernate.cfg.xml文件。然后在src中添加log4j.properties文件。 2.通过MyEclipse向导,导入实现Spring2.5功能,生成applicationContext.xml文件。然后将Spring2.0 AOP Liberaries里的asm2.2.3.jar包
Spring、Struts2优点分析以及Spring MVC、Struts2优点比较 Spring 及其优点 大部分项目都少不了Spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢Spring是什么:Spring是一个轻量级的DI和AOP容器框架。说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类。DI:称作依赖注入(Dependency Injection),和控制反转一个概念,具体的讲,当一个角色需要另外一个角色协助的时候,在传统的程序设计中,通常有调用者来创建被调用者的实例。但是在spring中创建被调用者将不再有调用者完
spring+hibernate+struts2零配置整合 说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置。 一。前期准备工作 gradle配置文件:
Struts2与Spring整合 本博文主要讲解Spring怎么与Struts2框架整合... Struts2和Spring的整合关键点: action对象交给Spring来创建 进入jar包 引入jar文件: 1)引入struts .
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载
相关文章
- 揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术
- Spring 整合 Redis
- Spring Boot启动时数据库初始化spring.datasource(转)
- Redis的Python客户端redis-py的初步使用
- spring boot:使用caffeine+redis做二级缓存(spring boot 2.3.1)
- Redis-Cluster实战--5.使用redis-cli安装
- redis单机搭建--详细
- spring 学习2-Spring Configuration in detail
- 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试
- spring boot:使用caffeine+redis做二级缓存(spring boot 2.3.1)
- Redis常用数据类型介绍、使用场景及其操作命令
- redis 内存淘汰策略和内存大小限制
- Redis缓存那点破事 , 绝杀面试官 25 问
- 解决com.alibaba.fastjson.JSONException: write javaBean error问题以及解决Spring Boot加入Shiro导致spring aop失效的问题
- 深入浅出Redis-redis哨兵集群
- Redis源代码分析(十二)--- redis-check-dump本地数据库检測
- Redlock:Redis分布式锁最牛逼的实现
- Redis 与 list 相关的常用命令
- 【java】Spring Boot --spring boot项目整合xxl-job