歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 基於注解的實現SpringMVC+MySQL

基於注解的實現SpringMVC+MySQL

日期:2017/3/1 9:06:42   编辑:Linux編程

目錄結構:

  1. SprinigMVC是什麼
  2. SpringMVC工作原理
  3. @Controller和@RequestMapping注解
    1. @Controller注解類型
    2. @RequestMapping注解類型
  4. 基於注解的SpringMVC+MySQL
  5. 參考文章

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>

SpringMVC+MyBatis集成配置 http://www.linuxidc.com/Linux/2016-09/135212.htm

SpringMVC總結篇 http://www.linuxidc.com/Linux/2016-06/132659.htm

Spring+SpringMVC企業快速開發架構搭建 http://www.linuxidc.com/Linux/2015-09/122942.htm

SpringMVC的亂碼處理 http://www.linuxidc.com/Linux/2015-07/120542.htm

Spring MVC+Spring3+Hibernate4開發環境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htm

Spring MVC整合Freemarker基於注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm

基於注解的Spring MVC簡單介紹 http://www.linuxidc.com/Linux/2012-02/54896.htm

SpringMVC詳細示例實戰教程 http://www.linuxidc.com/Linux/2015-06/118461.htm

SpringMVC錯誤頁面配置 http://www.linuxidc.com/Linux/2016-12/138097.htm

SpringMVC 異常處理 http://www.linuxidc.com/Linux/2015-06/119049.htm

SpringMVC框架入門配置 IDEA下搭建Maven項目 http://www.linuxidc.com/Linux/2016-09/134918.htm

Copyright © Linux教程網 All Rights Reserved