1. 程式人生 > >乾貨--Redis+Spring+Struts2實現網站計算器應用專案案例

乾貨--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