spring-redis-tutorial

This commit is contained in:
雪山飞鹄
2014-07-12 20:04:07 +08:00
parent 0f3cbe784b
commit 56f3cde737
23 changed files with 1187 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
/target
.classpath
.project
.settings
+18
View File
@@ -0,0 +1,18 @@
Description
===========
Sample application demonstrating how to create a Spring MVC 3.1 application with Spring Data Redis
To read the whole guide, please see the original blog:
"Spring MVC 3.1 - Implement CRUD with Spring Data Redis"
http://krams915.blogspot.com/2012/02/spring-mvc-31-implement-crud-with_6764.html
Building
========
Please visit http://krams915.blogspot.com/2012/02/spring-mvc-31-implement-crud-with.html for full instructions
Notes
=====
For more tutorials, please visit http://krams915.blogspot.com/
+273
View File
@@ -0,0 +1,273 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.krams</groupId>
<artifactId>spring-redis-tutorial</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring-redis-tutorial Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.core.version>3.1.0.RELEASE</spring.core.version>
<spring.data.redis.version>1.0.0.RC1</spring.data.redis.version>
<cglib.version>2.2</cglib.version>
<aspectj.version>1.6.10</aspectj.version>
<slf4j.version>1.6.1</slf4j.version>
<log4j.version>1.2.14</log4j.version>
<javax.servlet-api.version>2.5</javax.servlet-api.version>
<javax.jstl-taglibs.version>1.1.2</javax.jstl-taglibs.version>
<jackson.version>1.9.3</jackson.version>
<!-- Testing -->
<mockito.version>1.8.5</mockito.version>
<junit.version>4.8.2</junit.version>
<!-- Plugins -->
<maven.copy.plugin.version>0.2.3</maven.copy.plugin.version>
<maven.compiler.plugin.version>2.3.2</maven.compiler.plugin.version>
<maven.apt.plugin.version>1.0</maven.apt.plugin.version>
</properties>
<dependencies>
<!-- Spring Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- A seamless aspect-oriented extension to the Java programming language -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- Cglib is a powerful, high performance and quality Code Generation Library,
It is used to extend JAVA classes and implements interfaces at runtime. -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>${cglib.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- The JavaServer Pages Standard Tag Library (JSTL) encapsulates, as simple tags, core
functionality common to many JSP applications. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${javax.jstl-taglibs.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${javax.jstl-taglibs.version}</version>
</dependency>
<!-- Logger -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- The Simple Logging Facade for Java or (SLF4J) serves as a simple facade or abstraction
for various logging frameworks, e.g. java.util.logging, log4j and logback, allowing the end
user to plug in the desired logging framework at deployment time. -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Javax Servlet. This needs to be included for runtime only! -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- Data Mapper package is a high-performance data binding package built
on Jackson JSON processor -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Jackson is a high-performance JSON processor (parser, generator) -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.data.redis.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Testing dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.version}</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.core.version}</version>
<type>jar</type>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-redis-tutorial</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<!-- For main Spring releases -->
<repository>
<id>org.springframework.maven.release</id>
<name>Spring Maven Release Repository</name>
<url>http://maven.springframework.org/release</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<!-- For testing against latest Spring snapshots -->
<repository>
<id>org.springframework.maven.snapshot</id>
<name>Spring Maven Snapshot Repository</name>
<url>http://maven.springframework.org/snapshot</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<!-- For developing against latest Spring milestones -->
<repository>
<id>org.springframework.maven.milestone</id>
<name>Spring Maven Milestone Repository</name>
<url>http://maven.springframework.org/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<!-- JBoss repository -->
<repository>
<id>jboss</id>
<name>JBoss repository</name>
<url>https://repository.jboss.org/nexus/content/repositories/releases</url>
</repository>
</repositories>
</project>
@@ -0,0 +1,29 @@
package org.krams.aop;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.springframework.aop.interceptor.CustomizableTraceInterceptor;
/**
* Extends {@link CustomizableTraceInterceptor} to provide custom logging levels
*/
public class TraceInterceptor extends CustomizableTraceInterceptor {
private static final long serialVersionUID = 287162721460370957L;
protected static Logger logger4J = Logger.getLogger("aop");
@Override
protected void writeToLog(Log logger, String message, Throwable ex) {
if (ex != null) {
logger4J.debug(message, ex);
} else {
logger4J.debug(message);
}
}
@Override
protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
return true;
}
}
@@ -0,0 +1,14 @@
package org.krams.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class MediatorController {
@RequestMapping
public String getHomePage() {
return "redirect:/users";
}
}
@@ -0,0 +1,89 @@
package org.krams.controller;
import org.krams.domain.Role;
import org.krams.domain.User;
import org.krams.dto.UserListDto;
import org.krams.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService service;
@RequestMapping
public String getUsersPage() {
return "users";
}
@RequestMapping(value="/records")
public @ResponseBody UserListDto getUsers() {
UserListDto userListDto = new UserListDto();
userListDto.setUsers(service.readAll());
return userListDto;
}
@RequestMapping(value="/get")
public @ResponseBody User get(@RequestBody User user) {
return service.read(user);
}
@RequestMapping(value="/create", method=RequestMethod.POST)
public @ResponseBody User create(
@RequestParam String username,
@RequestParam String password,
@RequestParam String firstName,
@RequestParam String lastName,
@RequestParam Integer role) {
Role newRole = new Role();
newRole.setRole(role);
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(password);
newUser.setFirstName(firstName);
newUser.setLastName(lastName);
newUser.setRole(newRole);
return service.create(newUser);
}
@RequestMapping(value="/update", method=RequestMethod.POST)
public @ResponseBody User update(
@RequestParam String username,
@RequestParam String firstName,
@RequestParam String lastName,
@RequestParam Integer role) {
Role existingRole = new Role();
existingRole.setRole(role);
User existingUser = new User();
existingUser.setUsername(username);
existingUser.setFirstName(firstName);
existingUser.setLastName(lastName);
existingUser.setRole(existingRole);
return service.update(existingUser);
}
@RequestMapping(value="/delete", method=RequestMethod.POST)
public @ResponseBody Boolean delete(
@RequestParam String username) {
User existingUser = new User();
existingUser.setUsername(username);
return service.delete(existingUser);
}
}
@@ -0,0 +1,20 @@
package org.krams.domain;
public class Role {
private String id;
private Integer role;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getRole() {
return role;
}
public void setRole(Integer role) {
this.role = role;
}
}
@@ -0,0 +1,59 @@
package org.krams.domain;
public class User {
private String id;
private String firstName;
private String lastName;
private String username;
private String password;
private Role role;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
@@ -0,0 +1,18 @@
package org.krams.dto;
import java.util.List;
import org.krams.domain.User;
public class UserListDto {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
@@ -0,0 +1,53 @@
package org.krams.service;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
/**
* Service for initializing Redis with sample data
*/
public class InitRedisService {
@Autowired
private RedisTemplate<String, String> template;
public void init() {
// Delete existing ones
String key = "user"+"john";
template.opsForHash().delete(key, "id");
template.opsForHash().delete(key, "firstName");
template.opsForHash().delete(key, "lastName");
template.opsForHash().delete(key, "username");
template.opsForHash().delete(key, "password");
template.opsForHash().delete(key, "role");
key = "user"+"jane";
template.opsForHash().delete(key, "id");
template.opsForHash().delete(key, "firstName");
template.opsForHash().delete(key, "lastName");
template.opsForHash().delete(key, "username");
template.opsForHash().delete(key, "password");
template.opsForHash().delete(key, "role");
// Create new records
key = "user"+"john";
template.opsForHash().put(key, "id", UUID.randomUUID().toString());
template.opsForHash().put(key, "firstName", "John");
template.opsForHash().put(key, "lastName", "Smith");
template.opsForHash().put(key, "username", "john");
template.opsForHash().put(key, "password", "21232f297a57a5a743894a0e4a801fc3");
template.opsForHash().put(key, "role", "1");
template.opsForSet().add("user", key);
key = "user"+"jane";
template.opsForHash().put(key, "id", UUID.randomUUID().toString());
template.opsForHash().put(key, "firstName", "Jane");
template.opsForHash().put(key, "lastName", "Adams");
template.opsForHash().put(key, "username", "jane");
template.opsForHash().put(key, "password", "ee11cbb19052e40b07aac0ca060c23ee");
template.opsForHash().put(key, "role", "2");
template.opsForSet().add("user", key);
}
}
@@ -0,0 +1,106 @@
package org.krams.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import org.krams.domain.Role;
import org.krams.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private RedisTemplate<String, String> template;
public User create(User user) {
String key = "user"+user.getUsername();
template.opsForHash().put(key, "id", UUID.randomUUID().toString());
template.opsForHash().put(key, "firstName", user.getFirstName());
template.opsForHash().put(key, "lastName", user.getLastName());
template.opsForHash().put(key, "username", user.getUsername());
template.opsForHash().put(key, "password", user.getPassword());
template.opsForHash().put(key, "role", user.getRole().getRole().toString());
template.opsForSet().add("user", key);
return user;
}
public User read(User user) {
return user;
}
public List<User> readAll() {
List<User> users = new ArrayList<User>();
Collection<String> fieldKeys = new HashSet<String>();
fieldKeys.add("id");
fieldKeys.add("firstName");
fieldKeys.add("lastName");
fieldKeys.add("username");
fieldKeys.add("password");
fieldKeys.add("role");
Collection<String> keys = template.opsForSet().members("user");
for (String key: keys) {
User user = new User();
user.setId((String) template.opsForHash().get(key, "id"));
user.setFirstName((String) template.opsForHash().get(key, "firstName"));
user.setLastName((String) template.opsForHash().get(key, "lastName"));
user.setPassword((String) template.opsForHash().get(key, "password"));
user.setUsername((String) template.opsForHash().get(key, "username"));
Role role = new Role();
role.setRole(Integer.valueOf((String) template.opsForHash().get(key, "role")));
user.setRole(role);
users.add(user);
}
return users;
}
public User update(User user) {
String key = "user"+user.getUsername();
String existingRecord = (String) template.opsForHash().get(key, "id");
if (existingRecord == null) {
return null;
}
template.opsForHash().put(key, "firstName", user.getFirstName());
template.opsForHash().put(key, "lastName", user.getLastName());
template.opsForHash().put(key, "role", user.getRole().getRole().toString());
return user;
}
public Boolean delete(User user) {
String key = "user"+user.getUsername();
template.opsForHash().delete(key, "id");
template.opsForHash().delete(key, "firstName");
template.opsForHash().delete(key, "lastName");
template.opsForHash().delete(key, "username");
template.opsForHash().delete(key, "password");
template.opsForHash().delete(key, "role");
String existingRecord = (String) template.opsForHash().get(key, "id");
Boolean existingMember = template.opsForSet().remove("user", key);
if (existingRecord != null) {
return false;
}
if (existingMember == false) {
return false;
}
return true;
}
}
@@ -0,0 +1,20 @@
log4j.rootLogger=ERROR,console
#Console Appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%5p] [%t %d{hh:mm:ss}] (%F:%M:%L) %m%n
#Custom assignments
log4j.logger.aop=DEBUG,console
log4j.logger.scheduler=DEBUG,console
log4j.logger.controller=DEBUG,console
log4j.logger.service=DEBUG,console
log4j.logger.dao=DEBUG,console
#Disable additivity
log4j.additivity.aop=false
log4j.additivity.scheduler=false
log4j.additivity.controller=false
log4j.additivity.service=false
log4j.additivity.dao=false
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Class-Path:
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:property-placeholder properties-ref="deployProperties" />
<!-- Activates various annotations to be detected in bean classes -->
<context:annotation-config />
<!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
For example @Controller and @Service. Make sure to set the correct base-package -->
<context:component-scan base-package="org.krams" />
<!-- Configures the annotation-driven Spring MVC Controller programming model.
Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- Imports logging configuration -->
<import resource="trace-context.xml"/>
<!-- Imports datasource configuration -->
<import resource="spring-data.xml"/>
<bean id="deployProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"
p:location="/WEB-INF/spring.properties" />
</beans>
@@ -0,0 +1,133 @@
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
<c:url value="/users/records" var="recordsUrl"/>
<c:url value="/users/create" var="addUrl"/>
<c:url value="/users/update" var="editUrl"/>
<c:url value="/users/delete" var="deleteUrl"/>
<html>
<head>
<link rel='stylesheet' type='text/css' media='screen' href='<c:url value="/resources/css/style.css"/>'/>
<script type='text/javascript' src='<c:url value="/resources/js/jquery-1.6.4.min.js"/>'></script>
<script type='text/javascript' src='<c:url value="/resources/js/custom.js"/>'></script>
<title>User Records</title>
<script type='text/javascript'>
$(function() {
// init
urlHolder.records = '${recordsUrl}';
urlHolder.add = '${addUrl}';
urlHolder.edit = '${editUrl}';
urlHolder.del = '${deleteUrl}';
loadTable();
$('#newBtn').click(function() {
toggleForms('new');
toggleCrudButtons('hide');
});
$('#editBtn').click(function() {
if (hasSelected()) {
toggleForms('edit');
toggleCrudButtons('hide');
fillEditForm();
}
});
$('#reloadBtn').click(function() {
loadTable();
});
$('#deleteBtn').click(function() {
if (hasSelected()) {
submitDeleteRecord();
}
});
$('#newForm').submit(function() {
event.preventDefault();
submitNewRecord();
});
$('#editForm').submit(function() {
event.preventDefault();
submitUpdateRecord();
});
$('#closeNewForm').click(function() {
toggleForms('hide');
toggleCrudButtons('show');
});
$('#closeEditForm').click(function() {
toggleForms('hide');
toggleCrudButtons('show');
});
});
</script>
</head>
<body>
<h1 id='banner'>Record System</h1>
<hr/>
<table id='tableUsers'>
<caption></caption>
<thead>
<tr>
<th></th>
<th>Username</th>
<th>First Name</th>
<th>Last Name</th>
<th>Role</th>
</tr>
</thead>
</table>
<div id='controlBar'>
<input type='button' value='New' id='newBtn' />
<input type='button' value='Delete' id='deleteBtn' />
<input type='button' value='Edit' id='editBtn' />
<input type='button' value='Reload' id='reloadBtn' />
</div>
<div id='newForm'>
<form>
<fieldset>
<legend>Create New Record</legend>
<label for='newUsername'>Username</label><input type='text' id='newUsername'/><br/>
<label for='newPassword'>Password</label><input type='password' id='newPassword'/><br/>
<label for='newFirstName'>First Name</label><input type='text' id='newFirstName'/><br/>
<label for='newLastName'>Last Name</label><input type='text' id='newLastName'/><br/>
<label for='newRole'>Role</label>
<select id='newRole'>
<option value='1'>Admin</option>
<option value='2' selected='selected'>Regular</option>
</select>
</fieldset>
<input type='button' value='Close' id='closeNewForm' />
<input type='submit' value='Submit'/>
</form>
</div>
<div id='editForm'>
<form>
<fieldset>
<legend>Edit Record</legend>
<input type='hidden' id='editUsername'/>
<label for='editFirstName'>First Name</label><input type='text' id='editFirstName'/><br/>
<label for='editLastName'>Last Name</label><input type='text' id='editLastName'/><br/>
<label for='editRole'>Role</label>
<select id='editRole'>
<option value='1'>Admin</option>
<option value='2' selected='selected'>Regular</option>
</select>
</fieldset>
<input type='button' value='Close' id='closeEditForm' />
<input type='submit' value='Submit'/>
</form>
</div>
</body>
</html>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<context:property-placeholder properties-ref="deployProperties" />
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.server}" p:port="${redis.port}"/>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnectionFactory"/>
<!-- Service for initializing Redis with sample data using RedisTemplate -->
<bean id="initRedisService" class="org.krams.service.InitRedisService" init-method="init"/>
</beans>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- Declare a view resolver -->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" p:order="1"/>
</beans>
@@ -0,0 +1,3 @@
# database properties
redis.server=127.0.0.1
redis.port=6379
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- For parsing classes with @Aspect annotation -->
<aop:aspectj-autoproxy/>
<bean id="customizableTraceInterceptor" class="org.krams.aop.TraceInterceptor"
p:enterMessage="Entering $[targetClassShortName].$[methodName]($[arguments])"
p:exitMessage="Leaving $[targetClassShortName].$[methodName](): $[returnValue]"/>
<aop:config>
<aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * org.krams.service..*(..))"/>
<aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * org.krams.controller..*(..))"/>
</aop:config>
</beans>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Data Redis Tutorial</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
@@ -0,0 +1,62 @@
body {
font-family: Arial, sans-serif;
width: 500px;
margin: auto;
}
h1, hr {
margin: 0px;
padding: 0px;
}
#banner {
background: black;
padding: 5px;
color: white;
margin-top: 5px;
}
#controlBar {
padding-top: 3px;
}
table {
border: 1px solid;
width: 100%;
border-collapse: collapse;
}
tr, td, th {
border: 1px solid;
text-align: left;
padding: 5px;
}
caption {
font-weight: bold;
text-align: left;
}
form {
margin-top: 30px;
width: 70%;
}
legend {
font-weight: bold;
}
form input {
float: right;
}
fieldset input, fieldset select {
margin-left: 10px;
float: none;
}
fieldset label {
float: left;
width: 80px;
text-align: right;
}
@@ -0,0 +1,157 @@
/**
* Contains custom JavaScript code
*/
var urlHolder = new Object();
function loadTable() {
$.get(urlHolder.records, function(response) {
$('#tableUsers').find('tbody').remove();
for (var i=0; i<response.users.length; i++) {
var row = '<tr>';
row += '<td><input type="radio" name="index" id="index" value="'+i+'"></td>';
row += '<td>' + response.users[i].username + '</td>';
row += '<td>' + response.users[i].firstName + '</td>';
row += '<td>' + response.users[i].lastName + '</td>';
row += '<td>' + getRole(response.users[i].role.role) + '</td>';
row += '</tr>';
$('#tableUsers').append(row);
}
$('#tableUsers').data('model', response.users);
toggleForms('hide'); ;
});
}
function submitNewRecord() {
$.post(urlHolder.add, {
username: $('#newUsername').val(),
password: $('#newPassword').val(),
firstName: $('#newFirstName').val(),
lastName: $('#newLastName').val(),
role: $('#newRole').val()
},
function(response) {
if (response != null) {
loadTable();
toggleForms('hide'); ;
toggleCrudButtons('show');
alert('Success! Record has been added.');
} else {
alert('Failure! An error has occurred!');
}
}
);
}
function submitDeleteRecord() {
var selected = $('input:radio[name=index]:checked').val();
$.post(urlHolder.del, {
username: $('#tableUsers').data('model')[selected].username
},
function(response) {
if (response == true) {
loadTable(urlHolder.records);
alert('Success! Record has been deleted.');
} else {
alert('Failure! An error has occurred!');
}
}
);
}
function submitUpdateRecord() {
$.post(urlHolder.edit, {
username: $('#editUsername').val(),
firstName: $('#editFirstName').val(),
lastName: $('#editLastName').val(),
role: $('#editRole').val()
},
function(response) {
if (response != null) {
loadTable();
toggleForms('hide'); ;
toggleCrudButtons('show');
alert('Success! Record has been edited.');
} else {
alert('Failure! An error has occurred!');
}
}
);
}
function getRole(role) {
if (role == 1) {
return 'Admin';
} else if (role == 2) {
return 'Regular';
} else {
return 'Unknown';
}
}
function hasSelected() {
var selected = $('input:radio[name=index]:checked').val();
if (selected == undefined) {
alert('Select a record first!');
return false;
}
return true;
}
function fillEditForm() {
var selected = $('input:radio[name=index]:checked').val();
$('#editUsername').val( $('#tableUsers').data('model')[selected].username );
$('#editFirstName').val( $('#tableUsers').data('model')[selected].firstName );
$('#editLastName').val( $('#tableUsers').data('model')[selected].lastName );
$('#editRole').val( $('#tableUsers').data('model')[selected].role.role );
}
function resetNewForm() {
$('#newUsername').val('');
$('#newPassword').val('');
$('#newFirstName').val('');
$('#newLastName').val('');
$('#newRole').val('2');
}
function resetEditForm() {
$('#editFirstName').val('');
$('#editLastName').val('');
$('#editRole').val('2');
}
function toggleForms(id) {
if (id == 'hide') {
$('#newForm').hide();
$('#editForm').hide();
} else if (id == 'new') {
resetNewForm();
$('#newForm').show();
$('#editForm').hide();
} else if (id == 'edit') {
resetEditForm();
$('#newForm').hide();
$('#editForm').show();
}
}
function toggleCrudButtons(id) {
if (id == 'show') {
$('#newBtn').removeAttr('disabled');
$('#editBtn').removeAttr('disabled');
$('#deleteBtn').removeAttr('disabled');
$('#reloadBtn').removeAttr('disabled');
} else if (id == 'hide'){
$('#newBtn').attr('disabled', 'disabled');
$('#editBtn').attr('disabled', 'disabled');
$('#deleteBtn').attr('disabled', 'disabled');
$('#reloadBtn').attr('disabled', 'disabled');
}
}
File diff suppressed because one or more lines are too long