zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

干货--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仓库 立即下载