##Spring MVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。

Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。

它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所具有的优势。而且框架本身有代码,看起来容易理解。

##用注解
MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。
之前的项目比较简单,多是用JSP 、Servlet + JDBC 直接搞定,在项目中尝试用 Struts(Struts MVC)+Spring+Hibernate, 严格按照分层概念驱动项目开发,因项目需求一直不断变化,功能不断扩充、增强,技术构建也几经改变到目前有个稳定的应用,体会了很多感受,这次先对 Spring MVC 层进行一些个人总结。
MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,C(控制器)将V(视图、用户客户端)与M(javaBean:封装数据)分开构成了MVC ,这边不去讨论项目中是否应用MVC ,也不针对MVC的实现原理进行讲解,而是探讨实践中如何从应用SSH, 到Struts(Struts MVC)+Spring+Hibernate的演化过程。
先看 Struts 如何与 Spring 结合处理一次简单的请求响应代码,前台可以设为用 AJAX 调用:

  1. 在 struts-config.xml 文件中加入

2.在 applicationContext.xml 文件中加入

3.cn.base.GetPersonListAction 实现请求响应代码
可以看出一次请求需求如此多的步骤,在加上一个项目下来有很多这样的请求响应,将给配置文件管理带来很大的麻烦。
经过对 Spring 的深入应用, Spring 本身提供的 URL 请求控制,对其天然支持可以让我们不需要 applicationContext.xml 再次声明一次 URL 请求 Bean ,即减少了 Struts 的声明 URL ,达到减少些繁琐的配置。但只是少了一些而已,同样也会面临着配置文件的管理问题。
Spring 注解将给我们的工作带来些轻松,利用反射机制原理出现的注解就是为了解决配置大量的配置问题。请看下处理一次简单的请求响应代码
@Controller --声明控制器
@RequestMapping("/person") –声明URL
public class PersonControl extends BaseController {
@Autowired –业务接口注入
private personServices personServices;/*** 获得人员列表*@param request* @param response* @throws Exception*/
@RequestMapping(params = “method=geList”) --即处理/person.do? method=geList方法
public void getnodeList(HttpServletRequest request,HttpServletResponse response) throws Exception { //处理请求//处理响应}}

可以看出,在代码上加入注解可以省去我们上面说的多个配置文件的工作,达到简便的 MVC 处理请求响应。
再配上简单的配置文件声明,即可轻松处理项目的全部请求控制工作。
Spring MVC乱码问题
在使用Spring MVC 做java Web 项目时,乱码问题时常都会出现,解决方法也不尽相同,有简单也有复杂的;如果加入了Spring框架之后就不一样了,可以采用Spring框架自带的过滤器CharacterEncodingFilter,这样可以大大减轻了我们的工作量,即简单方便又容易理解,配置方式如下:在web.xml文件中filter的位置加上如下内容:

<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

文件上传

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
springmvc实现上传文件代码片段
<?xml version="1.0" encoding="UTF-8"?>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /></bean>
@Controller
@RequestMapping("/common")
public class CommonController {@RequestMapping(value = "/upload")
public @ResponseBody String upload(@RequestParam("file") MultipartFile file, HttpSession session) throws Exception {File localFile = new File("c:/test/a.rar");
file.transferTo(localFile);
return "success";
}
}

导入jar包
我们基于Spring mvc框架进行开发,需要依赖一下的spring jar包:
spring-aop-4.0.4.RELEASE.jar
spring-beans-4.0.4.RELEASE.jar
spring-context-4.0.4.RELEASE.jar
spring-core-4.0.4.RELEASE.jar
spring-expression-4.0.4.RELEASE.jar
spring-web-4.0.4.RELEASE.jar
spring-webmvc-4.0.4.RELEASE.jar
commons-logging-1.1.1.jar(用来打印log)
在WEB-INF目录下新建lib文件夹,并将上面的jar包放入其中。

1.加载pom.xml 加载库

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.foreknow</groupId><artifactId>foreknow_springmvc</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>foreknow_springmvc</name><properties><hibernate.version>5.1.0.Final</hibernate.version></properties><dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.10.1.RELEASE</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-c3p0</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies>
</project>

3.配置 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_2_5.xsd"version="2.5"><display-name>foreknow_springmvc</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>
<!--     拦截器  控制字符编码集  总中央控制器  就是servlet--><filter><filter-name>encodingFilter</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>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring-mvc-config.xml</param-value></context-param><servlet><servlet-name>dispatcherservlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name>
<!--     解析的是xml  如果名字变了  这个地方也改--><param-value>classpath:spring/spring-mvc-config.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>dispatcherservlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

##转发和重定向的区别?
转发:
request.getRequestDispatcher(“success.jsp”).forward(request,response);
在服务器组件收到用户请求后。经过它的处理后有传递给了另一个组件。不修改用户的请求码。各组件处理完之后在返回给用户,例如主页面的框架。
用户请求-----》服务器-------》组件1-------》组件2------->服务器-------》用户
(请求不变)
重定向:
response.sendRedirect(“success.jsp”);
在服务器组件收到用户请求后。经过处理修改用户请求。在返回给用户。这样用户再次使用这个请求就会被动的使用新的请求了。(重定向一般是为了防止用户提交完数据后点浏览器刷新或点后退之后产生重复提交)
用户请求-----》服务器-------》组件------>服务器-------》用户-------》新的请求
##区别:
1:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址。
2:重定向有两次请求,不共享数据,转发是有一次请求且共享数据。
3:重定向后地址栏会发生变化,转发不会。
4:重定向的地址可以是任意地址,转发的地址只能是当前应用类的某一个地址。
一、目标不同

转发是服务器行为,重定向是客户端行为 。

二、请求次数不同

1、重定向是两次request 。

第一次,客户端request一个网址,服务器响应,并response回来,告诉浏览器,你应该去别一个网址。

2、请求转发只有一次请求

三、网址定位不同

重定向的网址可以是任何网址,请求转发只能是指定网址。

四、导致的结果不同

不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

1、网站调整(如改变网页目录结构);

2、网页被移到一个新地址;

3、网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

package com.foreknow.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
//总路由
@RequestMapping("/admin")
public class HelloController {//子路由@RequestMapping(path="/hello",method=RequestMethod.GET)//String 提供的 modelmap一个容器      这个之前servlet 调用service   service返回的数据 list 然后把list 存到request//或者存到session里面    request.setAttributepublic String printHello(ModelMap map) {//ModelMap的作用可以保存数据//map.addAttribute(attributeName, attributeValue)map.addAttribute("message", "test springmvc......");return "hello";}
}

然后 通过controller的映射地址 就能找到方法 我们得通过核心配置文件spring-mvc-config.xml 进行配置

2.Spring MVC核心配置文件spring-mvc-config.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:mvc="http://www.springframework.org/schema/mvc"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--自动扫描   扫描这个包下所有 --><context:component-scan base-package="com.foreknow.controller"/><!--指定静态的资源(视图解析器)  --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property><property name="prefix" value="/WEB-INF/jsp/"></property><!--视图解析器的后缀 返回的.jsp的格式  --><property name="suffix" value=".jsp"></property></bean><!-- 开启注解映射的支持 --><mvc:annotation-driven/><!-- 表示JPA dao所在的包 --><jpa:repositories base-package="com.foreknow.repository"/><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/><property name="packagesToScan" value="com.foreknow.model" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/></property><property name="jpaProperties"><props><prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop><prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/blog?useSSL=false</prop><prop key="hibernate.connection.username">root</prop><prop key="hibernate.connection.password"></prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.connection.useUnicode">true</prop><prop key="hibernate.connection.characterEncoding">UTF-8</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.use_sql_comments">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop><prop key="hibernate.connection.autoReconnect">true</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="connection.autoReconnectForPools">true</prop><prop key="connection.is-connection-validation-required">true</prop><prop key="hibernate.c3p0.validate">true</prop><prop key="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</prop><prop key="hibernate.c3p0.min_size">5</prop><prop key="hibernate.c3p0.max_size">600</prop><prop key="hibernate.c3p0.timeout">1800</prop><prop key="hibernate.c3p0.max_statements">50</prop><prop key="hibernate.c3p0.preferredTestQuery">SELECT 1;</prop><prop key="hibernate.c3p0.testConnectionOnCheckout">true</prop><prop key="hibernate.c3p0.idle_test_period">3000</prop></props></property></bean><!-- 事务管理 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean>
</beans>

###问题 :name=“viewClass” 这个是自己起的吗?
答:不能随便起 对应的是value 的方法;

配置hello.jsp 页面(用EL表达式写):

<%@ 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>Insert title here</title>
</head>
<body>
<h1>hello,${message}</h1>
</body>
</html>

com.foreknow.controller通过映射文件/hello --经过spring-mvc-config.xml中的视图文件 让其返回值 跳转到hello.jsp格式 找到WEB-INF/jsp 下的jsp 页面

Spring MVC框架-持久层用hibernate自动化(1)相关推荐

  1. Mybatis,Spring,MVC框架

    文章目录 @[toc] unit12-mybatis框架 MyBatis简介(了解) 什么是MyBatis 为什么要使用MyBatis MyBatis快速入门 准备数据,创建库和表 创建工程,导入所需 ...

  2. 搭建基于spring MVC框架 + RESTful架构风格技术总结

    2019独角兽企业重金招聘Python工程师标准>>> 实战篇: 在SpringMVC框架中搭建RESTful架构风格来完成客户端与服务器端的低耦合度.可扩展性.高并发与大数据流量的 ...

  3. 在Spring MVC框架下利用RESTful API和MongoDB实现用户留言与邮件反馈

    在Spring MVC框架下,基于注解映射和数据绑定编写Java业务代码,采用MongoDB数据库进行数据存储,使用JSP和JS渲染表单页面,利用RESTful API实现基于URL的请求处理服务,以 ...

  4. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  5. Spring MVC框架在进行表单提交,自动封装成对象提交,在以对象的形式入参

    最近做了一个超市订单管理系统的项目,使用的是Spring MVC 和Spring 框架. 如上图:进行新用户添加.此处jsp页面代码如下: <div class="right" ...

  6. Spring MVC 框架搭建及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...

  7. 从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架

    如果创建一个 Spring 项目 Spring MVC 框架在 Java 的 Web 项目中应该是无人不知的吧,你不会搭建一个 Spring 框架?作为身为一个刚刚学习Java的我都会,如果你不会的话 ...

  8. local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架

    @[TOC] 自定义实现Spring Mvc框架 前言 在使用Spring Mvc时候我们需要配置一个中央处理器DispatcherServlet用于分发请求,根据url查找处理器,然后再根据处理器 ...

  9. Spring MVC框架——Web开发框架

    1.MVC设计模式 一般指MVC框架,M(Model)数据模型层,V(View)视图层,C(Controller)控制层. Controller层:获取用户的请求,处理相关业务逻辑,并成功跳转页面,负 ...

最新文章

  1. wpf checkbox选中触发事件_Cypress 可操作事件
  2. Linux System and Performance Monitoring
  3. 《漫画算法2》源码整理-3 二分查找 跳跃表
  4. linux、sql 常用的一些特殊符号
  5. java爬虫-简单爬取网页图片
  6. 《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...
  7. 魅思V20全新正规视频系统源码
  8. 为什么你的支付宝芝麻信用分就是不涨?
  9. Spring的三大核心接口——BeanFactory、ApplicationContext、WebApplicationContext
  10. undefined symbol: PyFPE_jbuf
  11. 【STM32】STM32驱动 LCD12864程序代码(串行方式)
  12. 俄文输入法_【俄语怎么学】手把手教你使用俄语输入法
  13. 【饭谈】软件测试薪资层次和分段(修仙)
  14. 机器学习(6)——凸优化理论(一)
  15. 面完18家大厂的算法岗位,吐血整理了一个面经!
  16. 微信公众号答题功能搭建
  17. “易融窃贼”--网贷平台隐私窃取
  18. 设计模式之里氏替换原则
  19. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  20. 小强升职记:时间管理故事书

热门文章

  1. mac OS X 10.9.2 gdb codesign
  2. 《Ray Tracing in One Weekend》——Chapter 4: Adding a sphere
  3. 计算机用户权限设置 xp,Windows XP权限设置详解 2
  4. filter笔记(主要看到黑马教程的ppt)
  5. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
  6. winform中listview选中整行_Excel办公实操,操作区域的3大小技巧,办公中的你使用过吗...
  7. 360浏览器清除缓存_放飞浏览器的反应速度
  8. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
  9. AcWing 785. 快速排序
  10. 索引、分区和分桶的区别