• 【Spring】SpringMVC之基于注解的实现SpringMVC+MySQL


    目录结构:

    contents structure [-]

    SpringMVC是什么

    MVC的全称是Model View Controller,通过实现MVC框架可以很好的数据、视图、业务逻辑进行分离。Spring MVC也是一种MVC框架,它是SpringFrameWork的后续产品,同样需要Spring的Jar包才能运行起来。

    SpringMVC工作原理

    SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的就是DispatcherServlet,DispathcerServlet负责将每一个request转发到相应的Controller,Controller处理后再返回模型(Model)和视图(View)。在使用注解的SpringMVC中,处理器Controller是基于@Controller和@RequestMapping进行注解的。

    @Controller和@RequestMapping注解

    @Controller注解类型

    声明一个控制器类,DispatcherServlet会通过扫描机制找到该类,如下是一个@Controller的例子。

    package com.example.controller;
    
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class ProductController {
    
    }

    为了保证DispatcherServlet能够扫描到该Controller,需要在DispatcherServlet中配置注解驱动和上下文扫描包。

    上下文扫描包:

    ……
        xmlns:context=http://www.springframework.org/schema/context
    ……

    注解驱动包:

    ……
        xmlns:mvc=http://www.springframework.org/schema/mvc
    ……

    然后应用<mvc:annotation-driven>和<context:component-scan/>元素:

    ......
    <
    mvc:annotation-driven></mvc:annotation-driven>
    <context:component-scan base-package=""></context:component-scan>
    ......

    @RequestMapping注解类型

    该注解类型在控制器类的内部定义每一个动作相应的处理方法,一个采用@RequestMapping注释的方法将成为一个请求处理方法,并由调度程序在接收到对应的URL请求时调用,下面是一个RequestMapping注解方法的控制器类。

    @Controller
    public class ProductController {
        
        @RequestMapping(value="/productInput")
        public String inputProduct(){
            //do something here
            return "ProductForm";
        }
    }

    使用requestMapping注解的value属性将URL映射到方法,在上面的例子中通过 http://localhost:8080/SpringMVC/productInput访问inputProduct方法。RquestMapping除了有value属性外,还有许多属性,比如method、consumes、header、path等等。例如当HTPP POST或PUT方法时才调用test()方法。

    @RequestMapping(value="/order_process", method={RequestMethod.POST, RequestMethod.PUT})
    public String test(){
        //do something here
        return "viewpage";
    }

    如果method属性只有一个HTTP方法值,则无需{},直接为method=RequestMethod.POST,如果未指定method属性,则请求处理方法可以处理任意HTTP方法。此外RequestMapping注释类型也可以用来注释一个控制器类。

    import org.springframework.stereotype.Controller;
    ...
    
    @Controller
    @RequestMapping(value="/customer")
    public class CustomerController{
        @RequestMapping(value="/delete", method={RequestMethod.POST, RequestMethod.PUT})
        public String deleteCustomer(){
            //do something here
            return “viewpage”;
        }
    }

    在这种情况下,所有的方法都将映射为相对于类级别的请求,如例子中的deleteCustomer方法,由于控制器类映射使用"/customer",而deleteCustomer方法映射为"/delete",则需要通过 http://localhost:8081/SpringMVC/customer/delete 访问。

    基于注解的SpringMVC+MySQL

    项目目录结构:

    login.jsp类

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>login</title>
     8 </head>
     9 <body>
    10     <form action="select.do" method="post">
    11         <input type="submit" value="查询所有信息"/>
    12     </form>
    13 </body>
    14 </html>
    login.jsp

    第二步:

    web.xml类

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>mydb2</display-name>
     4   <welcome-file-list>
     5     <welcome-file>welcome.html</welcome-file>
     6   </welcome-file-list>
     7   
     8   <!-- 这里是一个总控制器 -->
     9   <servlet>
    10     <servlet-name>spring</servlet-name>
    11     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    12   </servlet>
    13   <servlet-mapping>
    14     <servlet-name>spring</servlet-name>
    15     <url-pattern>*.do</url-pattern>
    16   </servlet-mapping>
    17   
    18   <!-- 解决POST提交乱码问题 -->
    19   <filter>
    20     <filter-name>EncodingName</filter-name>
    21     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    22     <init-param>
    23       <param-name>encoding</param-name>
    24       <param-value>utf-8</param-value>
    25     </init-param>
    26   </filter>
    27   <filter-mapping>
    28     <filter-name>EncodingName</filter-name>
    29     <url-pattern>/*</url-pattern>
    30   </filter-mapping>
    31   
    32 </web-app>
    web.xml

    spring-servlet.xml类

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:mvc="http://www.springframework.org/schema/mvc"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
     7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     9 
    10   
    11   <mvc:annotation-driven/>
    12   
    13   <context:component-scan base-package="com.spring"></context:component-scan>
    14   
    15   <!-- 获取properties配置文件 -->
    16   <bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    17     <property name="locations">
    18       <list>
    19         <value>classpath:db-config.properties</value>
    20       </list>
    21   </property>
    22   </bean>
    23  
    24   <!-- 获取数据源 -->
    25   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    26     <property name="driverClassName">
    27       <value>${db.dirverClass}</value>
    28     </property>
    29     <property name="url">
    30       <value>${db.url}</value>
    31     </property>
    32     <property name="username">
    33       <value>${db.username}</value>
    34     </property>
    35     <property name="password">
    36       <value>${db.password}</value>
    37     </property>
    38   </bean>
    39     
    40   <!-- 
    41         给jdbc模板注入数据源
    42        在JdbcTemplate里有一个对应的私有属性dataSource
    43   -->
    44   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    45     <property name="dataSource" ref="dataSource"></property>
    46   </bean>
    47     
    48   <!-- 
    49          给userDao(负责和数据库打交道)注入模板
    50         在com.spring.db.UserDao里应该设有一个JdbcTemplate jdbcTemplate的私有属性,并且setter
    51    -->    
    52   <bean id="userDao" class="com.spring.db.UserDao">
    53     <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    54   </bean>
    55 
    56   <!--定义视图 通过internalResourceView来表示 使用的是Servlet/jsp技术-->
    57   <bean id="viewResolver"    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    58     <property name="viewClass">
    59       <value>org.springframework.web.servlet.view.InternalResourceView</value>
    60     </property>
    61     <!--jsp存放的目录-->
    62     <property name="prefix">
    63       <value>/view/</value>
    64     </property>
    65     <!--jsp文件的后缀-->
    66     <property name="suffix">
    67       <value>.jsp</value>
    68     </property>
    69   </bean>
    70 </beans>
    spring-servlet.xml

    db-config.properties类

    db.url=jdbc:mysql:///test?characterEncoding=utf8&useSSL=true&serverTimezone=GMT
    db.username=root
    db.password=root
    db.dirverClass=com.mysql.cj.jdbc.Driver
    db-config.properties

    这里的Driver和版本有关系,笔者的Connection/j 是6.0.5的。

    UserVO.java类

     1 package com.spring.model;
     2 
     3 public class UserVO {
     4     private int id;
     5     private String name;
     6     private String pwd;
     7     
     8     public int getId() {
     9         return id;
    10     }
    11     public void setId(int id) {
    12         this.id = id;
    13     }
    14     public String getName() {
    15         return name;
    16     }
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20     public String getPwd() {
    21         return pwd;
    22     }
    23     public void setPwd(String pwd) {
    24         this.pwd = pwd;
    25     }
    26 }
    UserVO.java

    UserDao.java类

     1 package com.spring.db;
     2 
     3 import java.sql.ResultSet;
     4 import java.sql.SQLException;
     5 import java.util.List;
     6 
     7 import org.springframework.jdbc.core.JdbcTemplate;
     8 import org.springframework.jdbc.core.RowMapper;
     9 
    10 import com.spring.model.UserVO;
    11 
    12 public class UserDao {
    13 private JdbcTemplate jdbcTemplate;
    14     
    15 public JdbcTemplate getJdbcTemplate() {
    16     return jdbcTemplate;
    17 }
    18 
    19 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    20     this.jdbcTemplate = jdbcTemplate;
    21 }
    22     @SuppressWarnings({ "unchecked", "rawtypes" })
    23     public List<UserVO> find(){
    24         String sql="select * from userbo";//这里也可以添加查询限制条件
    25         return jdbcTemplate.query(sql, new RowMapper(){
    26 
    27             public Object mapRow(ResultSet rs, int num) throws SQLException {
    28                 UserVO uservo=new UserVO();
    29                 uservo.setId(rs.getInt("USERID"));
    30                 uservo.setName(rs.getString("USERNAME"));
    31                 uservo.setPwd(rs.getString("USERPSW"));
    32                 return uservo;
    33             }
    34         });
    35     }
    36 }
    UserDao.java

    这儿的jdbcTemplate不能用注解@Autowired来指定,因为在spring-servlet.xml文件中已经指定了扫描包为"com.spring",而jdbcTemplate的包为“org.springframework.jdbc.core.JdbcTemplate”,所以会扫描不到JdbcTemplate的。在spring-servlet.xml已经通过bean的方式,将数据源注入JDBC模板。

    LoginController.java类

     1 package com.spring.controller;
     2 
     3 import java.util.HashMap;
     4 import java.util.List;
     5 import java.util.Map;
     6 
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.stereotype.Controller;
     9 import org.springframework.web.bind.annotation.RequestMapping;
    10 import org.springframework.web.servlet.ModelAndView;
    11 import com.spring.db.UserDao;
    12 import com.spring.model.UserVO;
    13 
    14 @Controller
    15 public class LoginController {
    16     
    17     @Autowired
    18     private UserDao userDao;
    19     @SuppressWarnings("unchecked")
    20     
    21     @RequestMapping(value="/select.do")
    22     public ModelAndView selectAll(){
    23         
    24         @SuppressWarnings("rawtypes")
    25         Map model=new HashMap();
    26         
    27         List<UserVO> userVO=userDao.find();
    28 
    29         model.put("uservo", userVO);
    30         
    31         return new ModelAndView("userInfo",model);
    32     }
    33 }
    LoginController.java

    @Autowired根据字面意思可以很快理解,就是自动配置。有@Autowired注解的变量,会按照扫描路径进行查找文件并且自动配置信息。如果把userDao的注解@Autowired注解注释掉,也可以通过bean来实现相同的效果,首先在LoginController类里把userDao进行setter,如:

        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }

    然后再在spring-servlet.xml里面添加如下bean信息:

      <bean id="controller" class="com.spring.controller.LoginController">
        <property name="userDao" ref="userDao"></property>
      </bean>

    userInfo.jsp类

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@page import="com.spring.model.UserVO"%>
     3 <%
     4 @SuppressWarnings("unchecked")
     5 /*
     6 *这儿是合法的,根据com.spring.db.controller.LoginController中handleRequest的返回数据类型进行设置的。
     7 */
     8 List<UserVO> str= (List<UserVO>)request.getAttribute("uservo");
     9 %>
    10 
    11 <html>
    12   <head>
    13     <title>result</title>
    14   </head>
    15   
    16   <body>
    17   <table border="1">
    18           <tr>
    19             <td >编号</td>
    20             <td >姓名</td>
    21             <td >年龄</td>
    22         </tr>
    23    <%
    24            for(UserVO user:str){
    25                %>
    26                    <tr>
    27                        <td><%=user.getId() %></td>
    28                        <td><%=user.getName() %></td>
    29                        <td><%=user.getPwd() %></td>
    30                    </tr>
    31                <%
    32            }
    33     %>
    34     </table>
    35   </body>
    36 </html>
    userInfo.jsp

    参考文章

    http://www.cnblogs.com/zhanglei93/p/6264796.html

  • 相关阅读:
    阅读心得10:《京东咚咚架构演进 》
    hadoop beginning
    ubuntu docker
    Ubuntu学习——第一篇
    flexsim diary
    apollo 3.0 硬件系统
    这是一份详细的Apollo自动驾驶平台上手指南
    详解百度Apollo感知技术、高精地图和小度车载系统
    Apollo 2.5推基于动态的实时相对地图解决方案
    Apollo在功能安全方面的探索
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6269505.html
Copyright © 2020-2023  润新知