ijava学习网> 知识分享> JAVA框架> SpringMvc学习与使用

SpringMvc学习与使用

时间: 2018-10-23 09:22:21 标签

 


一、SpringMvc是什么?

Spring MVC属于SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块,使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架。说白了它是基于spring在MVC上的一个框架。

二、SpringMvc的作用是什么?

框架的作用都是为了提高代码的质量,也就是高质量的代码,而不是提高代码的性能。各种框架都有各自的性能,各不相同各自有可取之处也有不可取之处。当然,springmvc也有它的优势,它的处理器映射机制、控制器、分发器、处理各个程序之间的处理机制,变得非常容易。


三、SpringMvc相比其他框架有什么优势?

打个比较,就s2sh框架和springmvc框架的比较来看,SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。


SpringMVC和SSH的比较:

springmvc比较接近原生servlet,灵活度高。而且因为springmvc的controller是单例的,以及没有大量的过滤器,性能要比struts2好。SSH中操作数据库使用的是Hibernate的数据映射,操作的是对象。Hibernate本来就是基于JDBC的封装,所以较之执行原生态SQL效率上肯定比操作对象更快。还有最重要的一点就是springmvc开发起来更加便利,或许在总体性能上来说,不算是最好的。


Struts1使用JSTL EL表达式,但是对集合和索引属性的支持很弱。Struts2采用OGNL。
struts2是类级别的拦截, 一个类对应一个request上下文,springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应。
Strust1中通常以action访问时.do,struts2、spring mvc 都是以.action做结尾。
spring3 mvc可以认为已经100%零配置了。


注意它是如何保证安全的:springmvc controller是单例模式,整个程序只有一个对象实例。Spring的安全性是通过绑定threadlocal实现


注意:如果想使用Spring来实现Hibernate的功能,那么可以知己封装

               

四、SpringMvc的运行流程

1.struts2与springmvc的比较

Stuts2类级别,例如:model,request,response,类中所有的方法都共享
Struts2使用model对象来从页面封装参数到action;从action封装数据到页面;(双向)
SpringMVC方法级别,例如:model(MAP),只从action封装数据到页面(单向:但是springmvc有办法解决)

       

从这里就可以看出,springmvc的速度空前的强。


2.springmvc的工作原理(Struts和springmvc工作原理图比较)

               


springmvc:Jsp——>DispatcherServlet分发器——>通过handlerMapping处理器映射找到要处理的controller层——>最后处理完返回结果(newModelAndView)并通过视图解析器找到返回路径——>回到Jsp


3.springmvc的核心知识点儿

(1)分发器DispacherServlet是什么,它的作用是什么?

(2)处理器映射handlerMapping是什么?它的工作原理是什么?

(3)如何找到逻辑controller层,有哪几种方式?

(4)试图解析器是ViewResolver什么?如何构造?


4.常用的handlerMapping处理器映射

作用:分发器发过来的请求,通过该处理器映射找到对应的controller层的类及方法,这就是它的作用

1.第一种:BeanNameUrlHandlerMapping(默认)

2.第二种:SimpleUrlHandlerMapping(通过ID访问)

3.第三种:ControllerClassNameHandlerMapping(通过类名访问)


5.常用的控制器有哪些?

1.命令控制器

2.表单控制器

3.向导表单控制器


五、SpringMvc的使用

1.开发步骤,简单体验最简单的springmvc:

(1)、新建web project
(2)、引入jar包
(3)、配置分发器servlet DispatchServlet
(4)、创建控制器类
(5)、配置beans
(6)、创建jsp文件
(7)、发布、测试


jar包下载:Spring-framework官网下载地址:点击打开链接 本地下载还有案例:点击打开链接


   


当然如果怕出现错误:你把spring-freamwork的所有包的全部导进去,绝对没问题。

在web.xml中配置分发器:

  
  	action	org.springframework.web.servlet.DispatcherServlet
  	action
  	*.action


创建一个控制类继承了 AbstractController:

package cn.itcast.com.controler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HomeController extends AbstractController{

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(request.getParameter("username"));
		System.out.println(request.getRequestURI());
		System.out.println(request.getRequestURL());
		
		return new ModelAndView("customer/form1");//这里就是逻辑名
	}

}


在WEB-INF下创建action-servlet.xml,必须是这个名字,因为它的源码决定的(当然后期可以更改,改配置文件)。

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"
			


运行一下,访问:

      

其实springmvc的处理过程就是那么简单,不难.


2.介绍三个处理器映射

保持controller层不变,这里主要介绍,可以通过几种处理器来找controller层:

(1)BeanNameUrlHandlerMapping(默认):这个上面一句介绍了,它是通过name属性找类的

(2)SimpleUrlHandlerMapping(需要配置):通过ID号找类

controller1controller1controller1


把默认的那个去掉,在地址栏访问:http://localhost:8080/SpingMvcEg1/a.action?username=1234  试一下


(3)ControllerClassNameHandlerMapping(需要配置): 通过Controller的类名来访问到相应的controller类



注意:用类名访问的时候记得几个单词一起的时候,前几个都要小写,最后一个大写或者不写直接后缀.action

如: http://localhost:8080/SpingMvcEg1/home.action?username=1234

http://localhost:8080/SpingMvcEg1/homeController.action?username=1234

(这里就有一个问题了,跟默认的那个找name相同了,那么它是通过那个呢?这就是上面设置<propertyname="order" value="0">来控制优先级的问题了,看代码即可)

默认顺序是一下顺序,通过控制优先级可以改变:

                       


3.改变一下配置文件action-servlet.action,看看源码我们就知道,为什么是这个名字了

在DispatcherServlet extends FrameworkServlet的父类FranmeworkServlet中的以下东西,组成了这个配置文件的名字。

重点:public static final StringDEFAULT_NAMESPACE_SUFFIX = "-servlet";

        


改变一下,通常这样spring配置文件我们都是放在src下面的,我们也可以改变一下它的名字(但是要配置才能)

              

web.xml配置:

  	action	org.springframework.web.servlet.DispatcherServlet
  	
  		contextConfigLocation		classpath:springmvc-servlet.xml
  	
  	action
  	*.action


contextConfigLocation说明:

在dispacterServlet的父类org.springframework.web.servlet.FrameworkServlet中有这样一个路径设置set方法,只需要在web.xml中配置contextConfigLocation即可。

4.介绍几种常见控制器Controller

(1).CommandController命令控制器,就做到了jsp页面封装数据到实体类。

实体类:

package cn.itcast.com.domain;

import java.io.Serializable;

public class Customer implements Serializable{
	private String username;
	private String password;
	private Integer age;
	
	
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "Customer [username=" + username + ", password=" + password
				+ ", age=" + age + "]";
	}
	
	
	
}

在原来的工程上,新建controller类:MyCommendController.java

package cn.itcast.com.controler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

import cn.itcast.com.domain.Customer;

//AbstractCommandController这是命令控制器
public class MyCommendController extends AbstractCommandController{
	
	//在默认的构造器中设置
	public MyCommendController() {
		// TODO Auto-generated constructor stub
		//告诉spingmvc,我给command封装的是这个Customer实体类对象
			this.setCommandClass(Customer.class);
	}
	
	@Override
	protected ModelAndView handle(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		// TODO Auto-generated method stub
		//Object command: 
		//BindException errors:
		Customer customer = (Customer) command;
		System.out.println(customer.toString());
		return null;
	}

}

springmvc-servlet.xml中添加控制器配置

访问:

http://localhost:8080/SpingMvcEg1/mycommendController.action?username=1234&password=123&age=2

(2).表单控制器

MyFormController.java

package cn.itcast.com.controler;

import org.springframework.web.servlet.mvc.SimpleFormController;

import cn.itcast.com.domain.Customer;

public class MyFormController extends SimpleFormController{
	
	public MyFormController(){
		this.setCommandClass(Customer.class);
	}
	//当以get方式提交的时候,会直接跳转jsp页面而不会触发doSubmitAction方法,在web.xml中设置
	//以form表单post提交的时候,会自动调用doSubmitAction方法,自动封装到实体类
	@Override
	protected void doSubmitAction(Object command) throws Exception {
		// TODO Auto-generated method stub
		  Customer customer = (Customer)command;
		System.out.println(customer.toString());
	}
  
  
}

这里就有一个问题了?我得先跳到web-inf下面的这个页面才能进行提交,那不是还得重新写一个类进行跳转,不需要,文件中已经配置好,直接访问这个action即可,是否成功的问题它来解决。

先访问:http://localhost:8080/SpingMvcEg1/myform.action  看看效果是不是跳转到表单页面了

再填写数据,提交到成功页面了。

(3).向导表单控制器

在业务系统中,有时用户要填写的内容很多。51job填写简历,基本信息,教育经历,工作经历。分开填写,加入前面感觉需要修改,但是数据不能丢失(数据回显),可以在原来的基础上进行修改。

做一个例子,如下效果:                

inf.jsp

  USER:

Edu.jsp

  PASS:

Work.jsp

AGE:

MyWizardController.java控制类继承了AbstractWizardFormController

package cn.itcast.com.controler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;

import cn.itcast.com.domain.Customer;


/*3、向导表单控制器*/
public class MyWizardController extends AbstractWizardFormController {

	public MyWizardController() {
		// TODO Auto-generated constructor stub
		this.setCommandClass(Customer.class);
		//回显数据的保存,这是关键的地方:
		this.setCommandName("customer");
	}
	
	//成功完成
	@Override
	protected ModelAndView processFinish(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		// TODO Auto-generated method stub
		Customer customer =(Customer) command;
		System.out.println(customer.toString());
		return new ModelAndView("index");
	}
	
	//取消,转向第一个页面重新填写
	@Override
	protected ModelAndView processCancel(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		// TODO Auto-generated method stub
		return new ModelAndView("/wizard/Inf"); 
	}

}

springmvc-servlet.xml文件

wizard/Infwizard/Eduwizard/Work

访问:http://localhost:8080/SpingMvcEg1/mywizardController.action

试一试填写信息,分别上一步,下一步,取消,提交。看看效果

六、注解形式开发

1.注解开发

   在sprimgmvc3.0之后,它就全面支持

前面的,写一个类就得在配置文件写bean,很麻烦都体现不出spring的强大之处。用注解的形式进行开发

加必须的jar包,springmv-servlet.xml文件放在src下面,web.xml文件写分发器及spring文件的路径配置,都写好

写一个controller类:HomeController.java,开始运用注解

package com.itcast.control;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class HomeController {

	//1.逻辑处理
	//2.跳转页面
	
	@RequestMapping("home.action")  //访问的URL
	public String goHome(HttpServletRequest request){
		System.out.println(request.getParameter("user"));
		System.out.println(request.getRequestURI());
		return "index";  //逻辑名称,通过视图解析器ViewResolver拼接,找到跳转地址
		
	}
}

配置它的核心配置文件springmvc-servlet.xml,包自动扫描这个controller层的所有类

配置web.xml

	
  	contextConfigLocation
  	classpath:beans.xml
  	org.springframework.web.context.ContextLoaderListener
  	action	org.springframework.web.servlet.DispatcherServlet
  	
  		contextConfigLocation
  		classpath:springmvc-servlet.xml
  	
  	action
  	*.actionindex.jsp


部署并发布:

http://localhost:8080/SpringMvcNoteEg1/home.action?user=李三

2.springmvc自定义的标签库使用

Struts2标签非常丰富,远远超过springmvc

案例中有详细说明

3.文件上传

它的功能跟struts2,案例中有详细说明

4.拦截配置

" *.action"拦截所有URL后缀action资源 , "/" 拦截所有URL请求,包括action,静态资源js/iimages/css
这样就会导致静态资源不会被放行,但是有办法解决,在springmvc-servlet.xml中配置


版权说明| 关于ijava| 合作伙伴| 联系我们| 网站地图| 招贤纳士

Copyright © 2017 www.ijava.com All Rights Reserved 版权所有•ijava学习网 京ICP备14061482号-18         官方QQ:3325669927

ijava学习网提供免费java教程和大量java面试题库,给高级会员提供免费的java培训,同时提共一些java开发项目和java下载,java工程师,java菜鸟们快来哦。记住我们的网站:www.ijava.com