一共3個頁面:注冊頁,歡迎頁,用戶列表頁
很簡單的例子,主要是為了把流程走通,沒有各種驗證。
注冊頁:
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 MVCmaven的依賴<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
taglibs和jstl是為jsp中的標簽服務的.
web.xml<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/root-context.xml</param-value> </context-param> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Set Character Encoding--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Set Character Encoding--> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener></web-app>
注意:關于filter的定義順序,CharacterEncodingFilter必須放在HiddenHttpMethodFilter之前,否則會有中文亂碼的問題。(filter的執行是按照定義順序執行的)。
CharacterEncodingFilter,是為了中文編碼
HiddenHttpMethodFilter,因為html中的form表單只支持GET與POST請求,spring為了支持DELETE, PUT等操作,會在生成頁面代碼時,會把我們希望的操作添加到一個hidden的_method中,在外層通過post傳過去,所以我們需要通過HiddenHttpMethodFilter把真實的操作解析出來。
我們定義的 vs. 真實傳輸的
<form:form action="xxx" method="put"></form:form>
<form id="xxx" action="xxx" method="post"> <input type="hidden" name="_method" value="put"/></form>root-context.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:mongo="http://www.springframework.org/schema/data/mongo" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> <context:component-scan base-package="com.lemon.spring"/> <!-- 添加注解驅動 --> <mvc:annotation-driven/> <!-- 允許對靜態資源文件的訪問 --> <mvc:default-servlet-handler/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
這兒只貼了前半部分和spring mvc相關的,后面的會在mongodb那部分貼出來。
login.jsp<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %><html><head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/> <title></title></head><body><form:form commandName="user" action="signin"> <table> <tr> <td>First Name:</td> <td><form:input path="firstName"/></td> </tr> <tr> <td>Last Name:</td> <td><form:input path="lastName"/></td> </tr> <tr> <td> <input type="submit" value="注冊"/> </td> <td> <input type="button" value="用戶列表" onclick="javascruser_list.jsp<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %><%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %><html><head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/> <title>User List</title></head><body><form action="user_list"> <table> <tr> <td>查詢條件</td> <td> <input type="text" name="q"/> </td> <td> <input type="submit" value="查詢"/> </td> </tr> </table></form><hr><table border="1"> <tr> <td>index</td> <td><font>firstName</font></td> <td><font>lastName</font></td> </tr> <c:set var="index" value="1"/> <c:forEach var="u" items="${userList}"> <tr> <td>${index}</td> <td>${u.firstName}</td> <td>${u.lastName}</td> </tr> <c:set var="index" value="${index+1}"/> </c:forEach></table><hr><input type="button" value="首頁" onclick="Javascript:location.href='login'"></body></html>greeting.jsp<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %><html><head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/> <title></title></head><body><form:form action="login"> <table> <tr> <td colspan="2"> 恭喜您, 用戶${firstName}注冊成功! </td> </tr> <tr> <td> <input type="submit" value="首頁"/> </td> <td> <input type="button" value="用戶列表" onclick="javascript:location.href='user_list'"> </td> </tr> </table></form:form></body></html>LoginController.javapackage 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;@Controllerpublic 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<User> userList; if (q == "") { userList = userService.getUserList(); } else { userList = userService.getUserListByFirstName(q); } model.addAttribute("userList", userList); return "user_list"; }}service和domainIUserService.javapackage com.lemon.spring.service;import com.lemon.spring.domain.User;import java.util.List;public interface IUserService { User initUser(); boolean saveUser(User user); List<User> getUserList(); List<User> getUserListByFirstName(String firstName); User getUserByFirstName(String firstName); void insertUser(User user);}UserService.javapackage 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;@Servicepublic 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<User> getUserList() { return userRepository.findAll(); } @Override public List<User> getUserListByFirstName(String firstName) { QUser user = QUser.user; return (List<User>)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@Entitypublic 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.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.14.4</version> </dependency><dependency><groupId>org.hibernate.javax.persistence</groupId><artifactId>hibernate-jpa-2.0-api</artifactId><version>1.0.0.Final</version></dependency>Spring MongoDBroot-context.xml<mongo:mongo host="localhost" port="27017"> <mongo:options/> </mongo:mongo> <mongo:db-factory dbname="springdb" mongo-ref="mongo"/> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> <mongo:repositories base-package="com.lemon.spring.repository"/>其中關于mongodb的定義,按名稱應該可以猜的出來,也可以參考官方文檔。
maven依賴
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.5.2.RELEASE</version> </dependency>UserRepository.javapackage 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<User, String>{ List<User> findByFirstName(String firstName);}UserRepository直接繼承MongoRepository,默認已經提供了很多方法,比如save,不需要自己寫實現。
如果需要更多的查詢,可以按照方法的命名機制來進行定義。
當然除了直接繼承自MongoRepository外,還可以直接使用context中定義的mongotemplate,來自己定義接口和實現,參考下面兩個java文件
IPersonRepository.javapackage com.lemon.spring.repository;import com.lemon.spring.domain.User;public interface IPersonRepository { void insert(User user);}PersonRepository.javapackage 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;@Repositorypublic class PersonRepository implements IPersonRepository { @Resource private MongoOperations mongoTemplate; @Override public void insert(User user) { mongoTemplate.insert(user); }}QuerydslQuerydsl為我們提供了更多功能的查詢,詳細介紹請參考官網http://www.querydsl.com/static/querydsl/latest/reference/html/index.html
首先maven中添加依賴
<dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-mongodb</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> </dependency>然后修改UserRepository
public interface UserRepository extends MongoRepository<User, String>, QueryDslPredicateExecutor<User> { List<User> findByFirstName(String firstName);}maven中添加plugin
<plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.0.9</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>根據@Entity來生成類。
新聞熱點
疑難解答