乾貨--Redis+Spring+Struts2實現網站計算器應用專案案例
有關redis的介紹我就不說了,可以參看我前幾篇文章,redis快速入門
首先來看一下redis的應用場景
下面是我這個專案的的執行的場景截圖
這是我們經常在各部落格見到的頂和踩的畫面,對於這種場景,我們用非關係型資料庫來操作是非常不方便地,不光是查詢不方便(寫sql語句),而且在高併發的時候,可能會使系統假死,所以redis就派上用場了,它屬於非關係型資料庫,它直接操作記憶體,非常快速。
下面直接看程式碼
首先看看所需的包
除了Spring和Struts2所需的包外 還需連線redis的包 這裡是spring-data-redis
本專案是模擬使用者實現頂和踩的功能
所以先創一個實體類User
package com.yc.beans;
public class User {
private int ding;//頂
private int cai;//踩
public int getCai() {
return cai;
}
public void setCai(int cai) {
this.cai = cai;
}
public int getDing() {
return ding;
}
public void setDing (int ding) {
this.ding = ding;
}
}
因為是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">
<!-- spring的配置檔案的路徑, -->
<context-param>
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
首先看一下客戶端請求頁面 index.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
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 style="background: #0F0; height: 400px; width: 600px;">
<table
CELLPADDING="0"
border="1px"
bordercolor="yellow"
height="400px"
width="600px">
<tr>
<th
id="head"
align="left"
height="50px"
colspan="3">年度最熱門部落格</th>
</tr>
<tr id="content">
<td
height="200"
colspan="3">都說飛得越高,摔得越慘,但是我想看看我到底會摔得有多慘,落地了,只要沒死,那麼爬起來,每走一步都是向上! <br>
</br>
時間並不會真的幫我們解決什麼問題,它只是把原來怎麼也想不通的問題,變得不再重要了。
</td>
</tr>
<tr>
<td colspan="3">
<div class="ding">
<span class="sding">頂</span><img
alt="tup"
src="images/ding.gif"
onclick="addDing()"><span id="num"></span>
</div>
<div class="ding">
<span class="sding">踩</span><img
alt="tup"
src="images/cai.gif" onclick="addCai()"><span id="numcai"></span>
</div>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>
它發請求到UserAction,請後臺傳遞資料用JSON
所以再看看Struts.xml,
<?xml version="1.0" encoding="UTF-8" ?>
<!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_*" class="userAction" 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"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="6379" />
<property name="usePool" value="true" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisFactory" />
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
</bean>
<bean id="springRedisClientImpl" class="com.yc.redis.spring.clients.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;
public JsonModel getJsonModel() {
return jsonModel;
}
public void setJsonModel(JsonModel jsonModel) {
this.jsonModel = jsonModel;
}
public String Ding() {
User user = new User();
String num = userServiceImpl.Ding();
if (num != null && !"".equals(num)) {
user.setDing(Integer.parseInt(num));
jsonModel.setCode(1);
jsonModel.setObj(user);
}
return SUCCESS;
}
public String Cai() {
User user = new User();
String num = userServiceImpl.Cai();
if (num != null && !"".equals(num)) {
user.setCai(Integer.parseInt(num));
jsonModel.setCode(1);
jsonModel.setObj(user);
}
return SUCCESS;
}
public String Find() {
User user = new User();
System.out.println(userServiceImpl);
String num[] = userServiceImpl.Find();
user.setDing(Integer.parseInt(num[0]));
user.setCai(Integer.parseInt(num[1]));
jsonModel.setCode(1);
jsonModel.setObj(user);
return SUCCESS;
}
}
相關推薦
乾貨--Redis+Spring+Struts2實現網站計算器應用專案案例
有關redis的介紹我就不說了,可以參看我前幾篇文章,redis快速入門 首先來看一下redis的應用場景 下面是我這個專案的的執行的場景截圖 這是我們經常在各部落格見到的頂和踩的畫面,對於這種場景,我們用非關係型資料庫來操作是非常不方便地,不光是
Struts2實現建議計算器
工程結構 需要匯入的jar包 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:
java+redis+spring mvc實現釋出訂閱(不同專案間)
專案1:利用redis做訊息佇列釋出訊息 專案2:利用redis訂閱專案1釋出的訊息 專案1(釋出): properties配置檔案中redis配置: redis.hostName=192.168.1.1 redis.port=6379 redis.timeout=150
OSGI企業應用開發(十五)基於Spring、Mybatis、Spring MVC實現一個登入應用
前面文章中,我們已經完成了OSGI應用中Spring、Mybatis、Spring MVC的整合,本篇文章我們就在這個基礎上來完成一個簡單的登入應用,其中使用者名稱和密碼需要從資料庫中查詢。 前面文章中,我們已經搭建好的工作空間如下圖所示: 本篇文章中,
基於spring-cloud實現eureka註冊服務小案例
首先建立兩個專案,eureka-service和eureka-client。 eureka-server作為eureka的服務端,提供註冊服務,eureka-client作為eureka的客戶端,屬於一個應用,註冊到eureka註冊中心。 eureka-
mapReduce:網站日誌分析專案案例:資料清洗
一、資料情況分析 1.1 資料情況回顧 該論壇資料有兩部分: (1)歷史資料約56GB,統計到2012-05-29。這也說明,在2012-05-29之前,日誌檔案都在一個檔案裡邊,採用了追加寫入的方式。 (2)自2013-05-30起,每天生成一個數據檔案
Hadoop學習筆記—20.網站日誌分析專案案例(三)統計分析
網站日誌分析專案案例(三)統計分析:當前頁面一、藉助Hive進行統計1.1 準備工作:建立分割槽表 為了能夠藉助Hive進行統計分析,首先我們需要將清洗後的資料存入Hive中,那麼我們需要先建立一張表。這裡我們選擇分割槽表,以日期作為分割槽的指標,建表語句如下:(這裡關鍵之
Hadoop學習筆記—20.網站日誌分析專案案例(一)專案介紹
網站日誌分析專案案例(一)專案介紹:當前頁面一、專案背景與資料情況1.1 專案來源 本次要實踐的資料日誌來源於國內某技術學習論壇,該論壇由某培訓機構主辦,匯聚了眾多技術學習者,每天都有人發帖、回帖,如圖1所示。圖1 專案來源網站-技術學習論壇 本次實踐的目的就在於通過對該
Hadoop學習筆記—20.網站日誌分析專案案例(二)資料清洗
網站日誌分析專案案例(二)資料清洗:當前頁面一、資料情況分析1.1 資料情況回顧 該論壇資料有兩部分: (1)歷史資料約56GB,統計到2012-05-29。這也說明,在2012-05-29之前,日誌檔案都在一個檔案裡邊,採用了追加寫入的方式。 (2)自2013-05-
Struts1應用、實現簡單計算器、使用DispatchAction、顯示友好的報錯信息、使用動態Form簡化開發
實體類 ica setattr sources 建立 -s number asc rlogin 實現簡單的支持加、減、乘、除的計算器 復制一份Struts1Demo改動:Struts1Calc 方案1: Struts1Calc 創建ActionForm: CalcFor
Struts2+Spring+Hibernate實現員工管理增刪改查功能(一)之ssh框架整合
pri support scrip ext ack efault ring src 兩張 前言 轉載請標明出處:http://www.cnblogs.com/smfx1314/p/7795837.html 本項目是我寫的一個練習,目的是回顧ssh框架的整合以及
redis jwt spring boot spring security 實現api token 驗證
BE output date art parent byte[] web rmi time 文章地址:http://www.haha174.top/article/details/258083 項目源碼:https://github.com/haha174/jwt-toke
詳解Nginx搭建多網站實現虛擬主機應用
檢測服務 roo linux 聯網 應用程序 top n 行修改 ESS 系統用戶 簡介 虛擬主機是指在網絡服務器上分出一定的磁盤空間,管理員可以利用此部分空間,放置站點及應用組件,提供必要的數據存放和傳輸功能。虛擬主機,就是把一臺運行在互聯網上的物理服務器劃分成多個“虛擬
spring boot項目之redis分布式鎖的應用
key 什麽 其他 ng- 分布式鎖 即使 功能 pri ont SETNX key value 起始版本:1.0.0 時間復雜度:O(1) 將key設置值為value,如果key不存在,這種情況下等同SET命令。 當key存在時,什麽也不做。SETNX是”SET i
CXF實現簡單webservice應用、整合spring釋出到tomcat
前言 Apache CXF提供了用於方便地構建和開發WebService的可靠基礎架構。它允許建立高效能和可擴充套件的服務,可以部署在Tomcat和基於spring的輕量級容器中,也可以部署在更高階的伺服器上,例如Jboss、WebSphere或WebLogic。下面將建立一個簡單的we
基於redis 和阿里大魚簡訊介面實現網站狀態監控
rpoplpush source destination redis的 RPOPLPUSH 命令可以很直觀的在多個佇列中傳遞資料。當source和destination 相同時,RPOPLPUSH命令會不斷的將隊尾的元素移到隊首,藉助這個特性我們可以實現一個網站監控系統:
SPRING CACHE REDIS 註解式實現快取策略
為了解決資料庫查詢效率瓶頸,提升併發系統能力,快取的應用已經非常普遍和必要了。剛接觸REDIS時,如何使SPRING框架與REDIS更高效地整合,困擾了我很長時間。 先說下不使用SPRING CACHE時的兩種快取應用模式: 1.使用redis作為持久層的二級快
Struts2.5.17--實現簡單計算器
如果第一次接觸struts2可以參考文章初次使用Struts2.5.17 1.實現Action物件(業務邏輯處理) result.java package jisuanqi; import com.opensymphony.xwork2.ActionContext; import c
實現網站應用釘釘掃碼登入,及查詢使用者詳細資訊
package com.hqq.api.staff.services.impl; import com.alibaba.fastjson.JSONObject; import com.hqq.api.staff.entitis.Staff; import com.hqq.api.staff.repos.St
Spring MVC 使用 Spring Session 實現 Session 共享-Redis
使用Spring Session 通過 Redis 實現 Session 共享,用於多例項應用 Session 共享的簡單原理 使用者第一次訪問應用時,應用會建立一個新的 Session,並且會將 Session 的 ID 作為 C