spring-redis-tutorial
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
/target
|
||||
.classpath
|
||||
.project
|
||||
.settings
|
||||
@@ -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/
|
||||
@@ -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
Reference in New Issue
Block a user