springMVC入门程序

关于MVC请求流程:


spring mvc对MVC的请求流程处理:


由此可看出spring mvc中dispatcherservlet(前端控制器)起到了重要的作用,同时降低了各个模块之间的耦合。

环境配置:

jar包导入什么的就不多说了

在web.xml中配置前端控制器:

  <!-- 配置前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 指定配置文件位置,默认在web-inf下找servlet名-servlet.xml,这里为springmvc-servlet.xml -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springMVC.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<!--
  		这里可以使用*.action
  		/  表示拦截所有,但是这样静态的东西也会被拦截,比如jpg等等
  		/*在springmvc的底层是错误的拦截方式,会把我们返回到jsp页面的行为拦截 
  	 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>


在springmvc.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:p="http://www.springframework.org/schema/p"  
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:util="http://www.springframework.org/schema/util"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd              
    http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd                 http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd                   
    http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.0.xsd">
     
     <!-- 具体的handler -->
     <bean id="UserControl" name="/user.action" class="com.control.UserControl"></bean>
     
     <!-- (1)配置处理器映射器,都实现了HandlerMapping
     	此种映射器是通过handler的那么匹配的,即handler的name为一个url 
     -->
     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
     
     <!--(2)简单url映射, 集中配置bean的id对应 的url -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/user1.action">UserControl</prop>
                <prop key="/user2.action">UserControl</prop>
            </props>
        </property>
    </bean>
     
     <!-- 配置处理器适配器,都实现了HandlerAdapter
     		此种适配器要求,编写的handler需要实现Controller接口
      -->
     <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
     
     <!-- 另一种适配器
     	此种适配器要求,编写的handler需要实现 HttpRequestHandler接口
     	此种方式可以用来响应json字符串(同原生servlet)
     -->
     <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
     
     <!-- 配置视图解析器
     	这里使用的是jsp的视图解析器,默认使用jstl 
     -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>


这里使用了3个url来访问相同的handler,都可以访问,说明多个映射器可以共存(多个适配器可共存)


使用注解配置的springmvc.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:p="http://www.springframework.org/schema/p"    
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:util="http://www.springframework.org/schema/util"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                
    http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd                 http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd                     
    http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    
     <!-- 开启组件扫描,加载handler(controller),完成bean的创建和依赖注入 -->
     <context:component-scan base-package="com.lee.controller"></context:component-scan>
     
     <!-- 注解处理器映射器 -->
     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
	 <!-- 注解处理器适配器 -->    
     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
      
      <!-- 使用这种方式,代替了上面注解映射器和注解适配器
     mvc:annotation-driven中默认加载了很多参数绑定方法,比如json的转换解析器等。。。
     	开发中常用
      -->
     <!-- <mvc:annotation-driven/> -->
     
     <!-- 配置视图解析器
     	这里使用的是jsp的视图解析器,默认使用jstl 
     -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     	<property name="prefix" value="/WEB-INF/jsp/"/>
     	<property name="suffix" value=".jsp"/>
     </bean>
     
</beans>




handler中代码:

package com.control;

import java.util.ArrayList;
import java.util.List;

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

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

import com.domain.User;

public class UserControl implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		User user1 = new User();
		user1.setId(1);
		user1.setName("hello");
		user1.setPassword("world");
		
		User user2 = new User();
		user2.setId(2);
		user2.setName("张三");
		user2.setPassword("世界");
		
		List<User> list = new ArrayList<User>();
		list.add(user1);
		list.add(user2);
		
		//返回modelandview
		ModelAndView mav = new ModelAndView();
		//相当于request中设置属性
		mav.addObject("userlist", list);
		//指定视图
		mav.setViewName("/WEB-INF/jsp/user.jsp");
		
		return mav;
	}

}


使用注解后的handler

package com.lee.controller;


import java.util.List;

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.lee.domain.User;
import com.lee.service.impl.UserServiceImpl;

@Controller
public class UserController {
	@Autowired
	private UserServiceImpl userService;
	
	public UserServiceImpl getUserService() {
		return userService;
	}
	
	
	/**
	 * Description: 查找用户信息
	 * @author LiCheng
	 * @throws Exception 
	 * @date 2017年8月24日
	 */
	@RequestMapping("/findUser")
	public ModelAndView findUser() throws Exception{
		//1.调用service查找用户
		List<User> list = userService.findUserByState(1);
		
		//2.创建modelandview
		ModelAndView mav = new ModelAndView();
		mav.addObject("userlist", list);
		
		//3.指定视图
		mav.setViewName("user");
		
		return mav;
	}
}






jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
	<table border="1">
	<c:forEach items="${userlist }" var="user">
		<tr>
			<td>${user.id }</td>
			<td>${user.name }</td>
			<td>${user.password }</td>
		</tr>
	</c:forEach>
	</table>
</body>
</html>



关于springMVC的一些注解

@RequestMapping

1.设置url,方法上

2.窄化请求,类上

3.限制请求方式,可以设置多个,表示只能用限制的访问方式

如:@RequestMapping(value="/findUser",method={RequestMethod.GET,RequestMethod.POST})

这就表示只能通过get或者post提交请求


controller的返回值问题:

在上面的controller方法中,返回值为ModelAndView,把模型数据添到此对象,然后指定视图返回。

controller的返回值还可以是String类型,和void类型

String类型的返回值,指定视图,数据怎么办呢,需要在controller的方法中指定形参,Model model,这个springMVC默认支持的一种,通过Model对象的方法,设置我们需要传到前端的数据。在model对象的内部,和ModelAndView一样把里面的key/value数据依次复制给了request域。

如果返回值是String类型,就可以完成客户端register和服务器forward方式的跳转了。

分别为:return "register:XXX";

return "forward:XXX";

xxx为请求的url地址,如果跳转的url在本controller类中,只需要写子url即可。


如果返回值为void的话

操作方式和原生servlet差不多。



关于springMVC请求参数的问题:

springMVC的请求参数是通过controller方法的形参来获取的。

默认支持:HttpServletRequst,HttpServletResponse,HttpSession,Model/ModelMap

还支持简单类型:如int,string,float,dobule。。。。等等,需要注意的是,如果直接在controller方法中写简单类型的形参,形参的名字必须和url请求参数的key一致,如果不一致需要在形参前面配置@RequestParam(value="id")

这样就可以将url中请求参数的key同controller方法中的形参绑定起来。


pojo类的参数绑定,请求url参数如果很多,且都是一个pojo类中的属性,此时springMVC也提供了pojo类的参数绑定,需要遵守的是,前端url请求的参数的key名必须和pojo类中的属性名一致。


自定义参数绑定,有时候请求的url参数类型与后端使用类型不匹配,比如日期,这时候pojo类中那个属性的绑定会失败,可以通过在处理器适配器中添加自定义绑定规则来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值