设为首页 收藏本站
查看: 1995|回复: 0

[经验分享] Spring MVC + Spring MongoDB + Querydsl 通过maven整合实例

[复制链接]

尚未签到

发表于 2015-7-7 11:39:09 | 显示全部楼层 |阅读模式
效果图
  一共3个页面:注册页,欢迎页,用户列表页
  很简单的例子,主要是为了把流程走通,没有各种验证。

注册页:
DSC0000.png

欢迎页:
DSC0001.png

用户列表页:
DSC0002.png
  

源码地址
  https://github.com/lemonbar/spring-framework-mongodb
  

参考文档
  Spring framework: http://docs.spring.io/spring/docs/4.0.6.RELEASE/spring-framework-reference/htmlsingle/#spring-web
  Spring data mongodb: http://docs.spring.io/spring-data/data-mongo/docs/1.5.2.RELEASE/reference/html/
  Querydsl: http://www.querydsl.com/static/querydsl/latest/reference/html/index.html
  

代码实现(使用maven构建)

Spring MVC

maven的依赖




org.springframework
spring-context
${spring.framework.version}


org.springframework
spring-webmvc
${spring.framework.version}


taglibs
standard
1.1.2


jstl
jstl
1.2

  taglibs和jstl是为jsp中的标签服务的.

web.xml





contextConfigLocation
WEB-INF/root-context.xml


dispatcher
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation


1


dispatcher
/



CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding
UTF-8



CharacterEncodingFilter
/*



hiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter


hiddenHttpMethodFilter
/*


org.springframework.web.context.ContextLoaderListener


  注意:关于filter的定义顺序,CharacterEncodingFilter必须放在HiddenHttpMethodFilter之前,否则会有中文乱码的问题。(filter的执行是按照定义顺序执行的)。
  CharacterEncodingFilter,是为了中文编码
  HiddenHttpMethodFilter,因为html中的form表单只支持GET与POST请求,spring为了支持DELETE, PUT等操作,会在生成页面代码时,会把我们希望的操作添加到一个hidden的_method中,在外层通过post传过去,所以我们需要通过HiddenHttpMethodFilter把真实的操作解析出来。
  我们定义的 vs. 真实传输的










root-context.xml















  这儿只贴了前半部分和spring mvc相关的,后面的会在mongodb那部分贴出来。

login.jsp














First Name:



Last Name:














user_list.jsp









User List





查询条件












index
firstName
lastName




${index}
${u.firstName}
${u.lastName}








greeting.jsp















恭喜您, 用户${firstName}注册成功!














LoginController.java



package com.lemon.spring.controller;
import com.lemon.spring.domain.User;
import com.lemon.spring.service.IUserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.List;
@Controller
public class LoginController {
@Resource
private IUserService userService;
@RequestMapping("/login")
public String login(Model model) {
User user = userService.initUser();
model.addAttribute(user);
return "login";
}
@RequestMapping("/signin")
public String signin(User user,
Model model) {
//        userService.saveUser(user);
        userService.insertUser(user);
//        User savedUser = userService.getUserByFirstName(user.getFirstName());
model.addAttribute("firstName", user.getFirstName());
return "greeting";
}
@RequestMapping("/user_list")
public String userList(Model model, @RequestParam(required = false, value = "q", defaultValue = "") String q) {
List userList;
if (q == "") {
userList = userService.getUserList();
} else {
userList = userService.getUserListByFirstName(q);
}
model.addAttribute("userList", userList);
return "user_list";
}
}
service和domain

IUserService.java



package com.lemon.spring.service;
import com.lemon.spring.domain.User;
import java.util.List;
public interface IUserService {
User initUser();
boolean saveUser(User user);
List getUserList();
List getUserListByFirstName(String firstName);
User getUserByFirstName(String firstName);
void insertUser(User user);
}
UserService.java



package com.lemon.spring.service.impl;
import com.lemon.spring.domain.QUser;
import com.lemon.spring.domain.User;
import com.lemon.spring.repository.IPersonRepository;
import com.lemon.spring.repository.UserRepository;
import com.lemon.spring.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService implements IUserService {
@Resource
private UserRepository userRepository;
@Resource
private IPersonRepository personRepository;
@Override
public User initUser() {
User user = new User();
return user;
}
@Override
public boolean saveUser(User user) {
User u = userRepository.save(user);
if (u != null) {
return true;
}
return false;
}
@Override
public List getUserList() {
return userRepository.findAll();
}
@Override
public List getUserListByFirstName(String firstName) {
QUser user = QUser.user;
return (List)userRepository.findAll(user.firstName.contains(firstName));
}
@Override
public User getUserByFirstName(String firstName) {
return userRepository.findByFirstName(firstName).get(0);
}
@Override
public void insertUser(User user) {
personRepository.insert(user);
}
}
User.java



@Data
@Entity
public class User {
//    @Id
//    private String id;
private String firstName;
private String lastName;
}
  maven的pom.xml要引入两个dependency,lombok为自动生成get/set方法使用,hibernate-jpa-2.0-api是为了javax.presistence.Entity.






org.projectlombok
lombok
1.14.4


org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.0.Final

Spring MongoDB

root-context.xml



   







  其中关于mongodb的定义,按名称应该可以猜的出来,也可以参考官方文档。
  maven依赖



        
org.springframework.data
spring-data-mongodb
1.5.2.RELEASE

UserRepository.java



package com.lemon.spring.repository;
import com.lemon.spring.domain.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import java.util.List;
public interface UserRepository extends MongoRepository{
List findByFirstName(String firstName);
}
  UserRepository直接继承MongoRepository,默认已经提供了很多方法,比如save,不需要自己写实现。
  如果需要更多的查询,可以按照方法的命名机制来进行定义。
  
  当然除了直接继承自MongoRepository外,还可以直接使用context中定义的mongotemplate,来自己定义接口和实现,参考下面两个java文件

IPersonRepository.java



package com.lemon.spring.repository;
import com.lemon.spring.domain.User;
public interface IPersonRepository {
void insert(User user);
}
PersonRepository.java



package com.lemon.spring.repository.impl;
import com.lemon.spring.domain.User;
import com.lemon.spring.repository.IPersonRepository;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
@Repository
public class PersonRepository implements IPersonRepository {
@Resource
private MongoOperations mongoTemplate;
@Override
public void insert(User user) {
mongoTemplate.insert(user);
}
}
Querydsl
  Querydsl为我们提供了更多功能的查询,详细介绍请参考官网http://www.querydsl.com/static/querydsl/latest/reference/html/index.html
  首先maven中添加依赖




com.mysema.querydsl
querydsl-apt
${querydsl.version}
provided


com.mysema.querydsl
querydsl-mongodb
${querydsl.version}


com.mysema.querydsl
querydsl-jpa
${querydsl.version}


org.slf4j
slf4j-log4j12
1.6.1

  然后修改UserRepository



public interface UserRepository extends MongoRepository, QueryDslPredicateExecutor {
List findByFirstName(String firstName);
}
  maven中添加plugin




com.mysema.maven
apt-maven-plugin
1.0.9



process


target/generated-sources/java
com.mysema.query.apt.jpa.JPAAnnotationProcessor




  根据@Entity来生成类。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84087-1-1.html 上篇帖子: MongoDB,Redis,Tokyo Cabinet,BerkeleyDB之性能比较 下篇帖子: Memcached、MongoDB、Redis和tokyotyrant
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表