目录结构:

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类

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

login.jsp

第二步:

web.xml类

 <?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>mydb2</display-name>
<welcome-file-list>
<welcome-file>welcome.html</welcome-file>
</welcome-file-list> <!-- 这里是一个总控制器 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> <!-- 解决POST提交乱码问题 -->
<filter>
<filter-name>EncodingName</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>EncodingName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

web.xml

spring-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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
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-4.3.xsd"> <mvc:annotation-driven/> <context:component-scan base-package="com.spring"></context:component-scan> <!-- 获取properties配置文件 -->
<bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db-config.properties</value>
</list>
</property>
</bean> <!-- 获取数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>${db.dirverClass}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
</bean> <!--
给jdbc模板注入数据源
在JdbcTemplate里有一个对应的私有属性dataSource
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!--
给userDao(负责和数据库打交道)注入模板
在com.spring.db.UserDao里应该设有一个JdbcTemplate jdbcTemplate的私有属性,并且setter
-->
<bean id="userDao" class="com.spring.db.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean> <!--定义视图 通过internalResourceView来表示 使用的是Servlet/jsp技术-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.InternalResourceView</value>
</property>
<!--jsp存放的目录-->
<property name="prefix">
<value>/view/</value>
</property>
<!--jsp文件的后缀-->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</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类

 package com.spring.model;

 public class UserVO {
private int id;
private String name;
private String pwd; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}

UserVO.java

UserDao.java类

 package com.spring.db;

 import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper; import com.spring.model.UserVO; public class UserDao {
private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
} public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<UserVO> find(){
String sql="select * from userbo";//这里也可以添加查询限制条件
return jdbcTemplate.query(sql, new RowMapper(){ public Object mapRow(ResultSet rs, int num) throws SQLException {
UserVO uservo=new UserVO();
uservo.setId(rs.getInt("USERID"));
uservo.setName(rs.getString("USERNAME"));
uservo.setPwd(rs.getString("USERPSW"));
return uservo;
}
});
}
}

UserDao.java

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

LoginController.java类

 package com.spring.controller;

 import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.spring.db.UserDao;
import com.spring.model.UserVO; @Controller
public class LoginController { @Autowired
private UserDao userDao;
@SuppressWarnings("unchecked") @RequestMapping(value="/select.do")
public ModelAndView selectAll(){ @SuppressWarnings("rawtypes")
Map model=new HashMap(); List<UserVO> userVO=userDao.find(); model.put("uservo", userVO); return new ModelAndView("userInfo",model);
}
}

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类

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.spring.model.UserVO"%>
<%
@SuppressWarnings("unchecked")
/*
*这儿是合法的,根据com.spring.db.controller.LoginController中handleRequest的返回数据类型进行设置的。
*/
List<UserVO> str= (List<UserVO>)request.getAttribute("uservo");
%> <html>
<head>
<title>result</title>
</head> <body>
<table border="1">
<tr>
<td >编号</td>
<td >姓名</td>
<td >年龄</td>
</tr>
<%
for(UserVO user:str){
%>
<tr>
<td><%=user.getId() %></td>
<td><%=user.getName() %></td>
<td><%=user.getPwd() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>

userInfo.jsp

参考文章

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

【Spring】SpringMVC之基于注解的实现SpringMVC+MySQL的更多相关文章

  1. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  2. 使用 Spring 2.5 基于注解驱动的 Spring MVC

    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...

  3. 使用 Spring 2.5 基于注解驱动的 Spring MVC--转

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  4. 【Spring】基于注解的实现SpringMVC+MySQL

    目录结构: // contents structure [-] SprinigMVC是什么 SpringMVC工作原理 @Controller和@RequestMapping注解 @Controlle ...

  5. Spring Boot2.0之注解方式启动Springmvc

    回顾下springmvc原理图: DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件. 在 ...

  6. SpringMVC之基于注解的Controller

    参考博客:https://www.cnblogs.com/qq78292959/p/3760560.html Controller注解: 传统风格的Controller需要实现Controller接口 ...

  7. Spring MVC中基于注解的 Controller

         终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...

  8. Spring IOC之基于注解的容器配置

    Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...

  9. Spring 使用AOP——基于注解配置

    首先,使用注解实现AOP是基于AspectJ方式的. 创建包含切点方法的类 package cn.ganlixin.test; import org.aspectj.lang.annotation.P ...

随机推荐

  1. 关于 redis 报错 :JsonParseException: Unrecognized token 'xxx': was expecting ('true', 'false' or 'null')

    在使用java  读取redis存储的数据时出现 JsonParseException: Unrecognized token 'xiaoqiang': was expecting ('true', ...

  2. oauth2-server-php-docs 集成3

    Yii集成 对于Yii集成,请通过Filsh查看Yii OAuth2服务器资源库 CakePHP的 有关CakePHP中集成的这个库的示例,请参阅Qsoomro CakePHP OAuth2 Demo ...

  3. Python 各种测试框架简介

    转载:https://blog.csdn.net/yockie/article/details/47415265 一.doctest doctest 是一个 Python 发行版自带的标准模块.本篇将 ...

  4. [Canvas]奔跑的马

    下载地址:https://files.cnblogs.com/files/xiandedanteng/52-WalkingHorse.rar,请用Chrome浏览器打开观看动态效果. 图例: 源码: ...

  5. iOS DES ECB 模式加密

    //iOS DES ECB 模式加密 #import <CommonCrypto/CommonCryptor.h> ,,,,,,,}; +(NSString *) encryptUseDE ...

  6. HDS TrueCopy-数据远程容灾白皮书-IOPS数据

    http://wenku.it168.com/d_000767925.shtml Truecopy 安装实施-包含图 http://www.docin.com/p-261693079.html 来自: ...

  7. Window10中创建目录连接点

    使用命令: mklink /J "junction point name" "target directory" 如,我有一个文件夹在D:\aa,想存在相同的目 ...

  8. 012-Go ORM框架之Gorm测试

    1:参考:https://github.com/jinzhu/gorm 2:数据库脚本(pg) -- create table posts( id serial primary key, conten ...

  9. SQL Server connect to MySQL SQL Server通过LinkServer访问MySQL数据库,并操作mysql数据库代码

    SQL Server 中需要访问MySQL的数据,可以通过调用MySQL的ODBC驱动,在SQL Server中添加LinkServer的方式实现. 1.从MySQL网站下载最新的MySQL ODBC ...

  10. 索引全扫描(INDEX FULL SCAN)

    所谓的索引全扫描(INDEX FULL SCAN)就是指要扫描目标索引所有叶子块的所有索引行.这里需要注意的是,索引全扫描需要扫描目标索引的所有叶子块,但这并不意味着需要扫描该索引的所有分支块.在默认 ...