springMVC+spring data jpa的使用

直入主题,不过多介绍spring的强大之处。
springMVC是一个mvc框架,而spring data jpa则是spring的一个数据层框架,二者整合的优势在于,都是spring产品,整体项目的风格会比较贴近,代码简洁高效。

1,需要的jar包,我的博客中已经给出了单独使用springMVC需要的包和单独使用spring data jpa需要的包(见spring data jpa简单案例springMVC入门,环境搭建)。
原以为整合springMVC和spring data jpa只是简单将二者的包组合到一起,在EE环境下运行就可以了,但实际上还需要几个其他的依赖包。
这里写图片描述

整个项目需要的所有包如下图所示:
这里写图片描述
这些包可以在博文末尾的项目下载地址中得到(下载整个项目,也可以单独下载其中的jar包);

2,项目结构:
这里写图片描述

3,配置文件:
(1)web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <!-- 加载并处理spring-demo-cfg.xml文件,以便自动注入需要的bean对象 -->
    <display-name>springmvctest</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-*.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 加载/WEB-INF/[servlet-name]-servlet.xml -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

(2)springMVC的配置文件springmvc-servlet.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:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
        http://www.springframework.org/schema/task 
        http://www.springframework.org/schema/task/spring-task-4.2.xsd">

    <!-- 配置controller的扫描路径 -->
    <context:component-scan base-package="com.hxq.wap.controller" >
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 视图层配置,视图层的读取路径由这里的属性决定,视图(页面)路径=prefix+controller返回的值+suffix -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <!-- 启动JSON格式的配置,有此配置项可使用@ResponseBody注解返回json数据 -->
                <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <!-- 解决 HttpMediaTypeNotAcceptableException: Could not find acceptable representation -->
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
</beans>

(3)spring的配置文件spring-demo-cfg.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:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd">
    <!-- spring扫描的包路径 -->
    <context:component-scan base-package="com.hxq.wap"/>

    <!-- 使用事务管理和设置处理事务的类,通过bean id进行关联 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- jpa的配置 -->
    <jpa:repositories base-package="com.hxq.wap.dao"  repository-impl-postfix="Impl" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false"/>
                <property name="showSql" value="true"/>
            </bean>
            </property>
    </bean>

</beans>

(4)jpa的配置文件persistence.xml,注意这个配置文件的路径要在src/META-INF/目录下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="SimplePU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- SE环境中需要显示声明entity类路径 EE环境中不需要 -->
        <!-- <class>com.hxq.wap.entity.UserEntity</class> -->
        <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa_test"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

嗯,配置文件挺多的,但我已经尽量把配置文件的内容简化了,呵呵;

4,数据表结构:
这里写图片描述
为了方便示例,表是简单的,代码也做了许多简化,例如各种条件判断等…

5,java代码:
(1)entity(或者说dto)层UserEntity.java:

package com.hxq.wap.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

//entity实体类的注解
@Entity
//实体类对应的数据表的注解
@Table(name="user")
public class UserEntity{
    
    
    private Integer id;
    private String userName;
    private String password;
    private String realName;
    private Integer age;
    //主键注解
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    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 String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

(2)dao层UserDao.java:

package com.hxq.wap.dao;

import org.springframework.data.repository.Repository;
import com.hxq.wap.entity.UserEntity;

public interface UserDao extends Repository<UserEntity, String>{
    
    
    public UserEntity findByUserNameAndPassword(String userName,String password);
}

很轻松的dao层代码,只需要了解jpa的方法命名规范就可以实现简单的CRUD,也可以自定义SQL语句和HQL语句。
(3)service层,接口UserService.java和对应的实现类UserServiceImp.java:

package com.hxq.wap.service;

import com.hxq.wap.entity.UserEntity;

public interface UserService {
    
    
    public UserEntity login(String userName,String password);
}
package com.hxq.wap.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hxq.wap.dao.UserDao;
import com.hxq.wap.entity.UserEntity;

@Service("userService")
public class UserServiceImp implements UserService{
    
    
    //@Autowired是声明自动注入相应对象的注解,注入对象的类型须是接口类型
    @Autowired
    private UserDao dao;

    @Override
    public UserEntity login(String userName,String password) {
        return dao.findByUserNameAndPassword(userName, password);
    }
}

(4)控制层UserCtrl.java:

package com.hxq.wap.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.hxq.wap.entity.UserEntity;
import com.hxq.wap.service.UserService;

@Controller
@RequestMapping(value = "")
public class UserCtrl{
    @Autowired 
    private UserService userService;

    @RequestMapping(value = "/wap/login.do")
    public String login(){
        //返回字符串,实际就是返回一个页面,这个页面的路径等于springmvc-servlet.xml配置文件中的prefix+这里返回的值+suffix
        return "wap/login";
    }

    @RequestMapping(value = "/wap/doLogin.do")
    //@ResponseBody 这个注解是用来返回json格式数据的;添加这个注解,返回的就不是页面,而是json数据
    public ModelAndView doLogin(HttpServletRequest request,HttpSession session){
        //返回类型为ModelAndView,也是返回一个页面,但是可以把页面需要的数据放在ModelAndView的对象中
        ModelAndView m = new ModelAndView("wap/index");
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        //这里为了简便,省去参数是否为空是否合法的判断
        UserEntity user = userService.login(userName, password);
        if(user!=null){
            //放入一个数据,在页面可以通过"${userName}"的形式取出来
            m.addObject("userName", user.getRealName());
        }
        //为了简便,省略错误情况的处理。。。。
        return m;
    }
}

6,页面一般采用jsp+jstl展示需要的页面和数据,这里只写了一个非常简单的两个jsp页面作为参考:
(1)login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
  <head>
    <!-- 定义当前页面的路径 -->
    <base href="<%=basePath%>wap/">
    <title>简单登录页面</title>
  </head>
  <body>
    <form action="doLogin.do" method="POST">
        <input name="userName" type="text"/>
        <br/>
        <input name="password" type="password"/>
        <br/>
        <input value="提交" type="submit"/>
        <input value="重置" type="reset"/>
    </form>
  </body>
</html>

(2)index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML>
<html>
  <head>
    <base href="<%=basePath%>wap/">
    <title>简单首页</title>
  </head>

  <body>
   ${userName}...你好,欢迎登录。
  </body>
</html>

嗯,简单还有点敷衍的页面…….

7,以上所有代码搞完之后,将项目部署到tomcat(我的项目名是springMVC),启动tomcat访问结果:
这里写图片描述
输入“juong”和“123”,点击提交,结果如下,
这里写图片描述

完整项目下载地址,需要使用git工具下载。

Guess you like

Origin blog.csdn.net/qq_36779082/article/details/75042836