zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6269505.html
Copyright © 2011-2022 走看看