SpringMvc详解(一)

项目文件(SpringMvc1.rar)
springMVC初次学习
SpringMVC 简介
SpringMVC 的执行流程
SpringMVC 的入门案例
SpringMVC 相关配置文件解析
SpringMVC 的参数绑定
SpringMVC 自定义类型转换器
SpringMVC 控制器方法的返回值处理
SpringMVC 的跳转 以及重定向传值

1.springMVC简介
springMVC本身也是基于对servlet进行了封装,也是轻量级的web开发框架之一
从使用角度来说,就是依赖大量的注解,达到传统意思上面MVC的Controller的功效

2.springMVC的执行流程
一个请求匹配前端控制器 DispatcherServlet的请求映射路径(在web.xml中指定),WEB容器将该请求转交给DispatcherServlet * 处理DispatcherServlet 接收到请求后, 将根据请求信息交给处理器映射器(HandlerMapping)
HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链
DispatcherServlet 再请求 处理器适配器(HandlerAdapter)调用相应的Handler进行处理并返回ModelAndView给DispatcherServlet
DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
DispatcherServlet 将页面响应给用户

设计代码,就是所谓的高内聚,低耦合
3.SpringMVC入门
新建项目,并且导入对应的jar包
在这里插入图片描述
页面中发起一个同步的请求 hello
在web.xml中
注意解决乱码可以配置/,但是可能会出现不生效的情况,所以建议填写(/*)

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
	<!-- 处理POST提交乱码问题 -->
  <filter>
  	<filter-name>encoding</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>encoding</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

<!-- 前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 不使用 默认找 /WEB-INF/[servlet的名称(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>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>	
</web-app>

3.1 完善联络关系表 springmvc.xml 在src下

<?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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	                   http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                       http://www.springframework.org/schema/mvc 
                       http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                       http://www.springframework.org/schema/context 
                       http://www.springframework.org/schema/context/spring-context-4.1.xsd">
 <!-- 扫描包以其子包下所有类的注解 @Controler @Service-->
<context:component-scan base-package="com.wwj"/>

<!-- 注解驱动 -->
<mvc:annotation-driven/>

<!-- 视图解释器 使用前后缀拼接跳转页面路径 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/jsp/"/>
	<property name="suffix" value=".jsp"/>
</bean>
 </beans>

编写controller层

@Controller
public class HelloController {
	@RequestMapping("/hello")
	public ModelAndView login(){
		//处理业务逻辑
		ModelAndView mv =  new ModelAndView();
		mv.addObject("pOne","wwj");
		mv.setViewName("main");
		return  mv;
	}
}

注意:如果在jsp页面使用el表达式,无法取值的话,可以在jsp抬头上面添加<%@ page isELIgnored =”false” %>

4.SpringMVC 相关配置文件解析(了解)
web.xml中添加了init-param 主要是调整我们的配置文件位置加载在src目录下

关于url-pattern常用规则

使用url-pattern配置为 / 拦截所有的请求

使用(.action或者.do) 也就是加一个动作标签

如果使用/* 而我们访问的是一个/xxx.html 或者是 /xxx.jsp 的静态资源。那么拦截了之后,返回对应的设置的value=”/WEB-INF/jsp/” 是无法找到的。

/并不是真正意义上的拦截所有请求,它不会拦截jsp的页面请求,其他的请求则会拦截 /*才是真正意义上的拦截所有请求

5.SpringMVC 的参数绑定的多种方式
分类

接收多个独立的参数
接收简单的对象类型(包含时间处理)
接收复杂的对象类型 (了解)
接收restful形式的参数 (理解)
接收json数据或者是json字符串

接收多个独立的参数

<form action="a1" method="post">
	<input type="text" name="a"/>
	<input type="text" name="b"/>
	<button>提交</button>
</form>
//接收多值的参数
	@RequestMapping("/a1")
	public void login(@RequestParam(value="a") String a,@RequestParam(value="b") String b){
		System.out.println(a+b);
	}

接收简单的对象类型(处理时间类型)(参数一一对应)

public class Person  implements  Serializable{
		private  int pid;
		private  String name;
		//处理前端传回后端的时间
		@DateTimeFormat(pattern="yyyy-MM-dd")
		private  Date   bir;
		}

<form action="a2" method="post">
	<input type="text" name="pid"/>
	<input type="text" name="name"/>
	<input type="text" name="bir"/>
	<button>提交</button>
</form>


	@RequestMapping("/a2")
	public void login(Person  p){
		System.out.println(p.getPid());
		System.out.println(p.getName());
		System.out.println(p.getBir().toString());
	}

参数不一一对应,传回的参数只是实体类熟悉的一部分,前提(名称必须相同)
使用JSONObject对象中的parseObject()方法。(不是用form表单传值,而是用ajax的json字符串传回后端)

@RequestMapping("/addRole")
@ResponseBody
	public String addRole(String text,int[] cheboxIds) {
		Role   role = (Role) JSONObject.parseObject(text, Role.class);
		}

注意:如果就只传递类似时间格式的字符串而又不包含的在对象中,可以考虑使用java库处理时间字符串,也可以使用全局的自定义转换器(了解)后续会讲到

接收复杂的对象类型 (了解)
对象中多添加List属性private List dognames;

<form action="a3" method="post">
	<input type="text" name="pid"/>
	<input type="text" name="name"/>
	<input type="text" name="bir"/>
	<input type="text" name="dognames[0]"/>
	<input type="text" name="dognames[1]"/>
	<input type="text" name="dognames[2]"/>
	<button>提交</button>
</form>
	@RequestMapping("/a3")
	public void login2(Person  p){
		System.out.println(p.getPid());
		System.out.println(p.getName());
		System.out.println(p.getBir().toString());
		System.out.println(p.getDognames().size());
	}

接收restful形式的参数 (理解)
何为restful /a4/pname/wwj/ 设计请求的api

<a href="a4/pname/wwj">hellrestful</a>
	@RequestMapping(value="/a4/{pnameattr}/{name}")
	public void login3(@PathVariable(value="pnameattr") String pnameattr,@PathVariable(value="name") String name){
			System.out.println(pnameattr+name);
	}

接收json数据或者是json字符串(需要先用到jquery ajax,暂时不设置返回,因为还需额外的jar包进行转换)

暂时先引入: <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
$(function(){
	var  user = {
			uname : 'wwj',
			uage : 18
	}
	 $.ajax({
	          url: "a5",
	          type: "post",
	          dataType:'json',
	          data: user,
	          success: function (json) {
     
	         }
})
})
//后台接收
	@RequestMapping("/a5")
	public void login4(@RequestParam("uname") String uname,@RequestParam("uage") String uage){
			System.out.println(uname+uage);

	}

注意:这种方式不推荐,也就是ajax传递json的字符串,而不是对象,那么需要在ajax中设置 contentType : ‘application/json;charset=utf-8’
赋值参数绑定

直接使用原生的servlet对象以及model(等同于设置到request作用域中)

@RequestMapping("/a6")
	public void login5(HttpServletRequest  req ,HttpServletResponse resp,Model  model){
	}

modelView和modelMap不推荐

6.自定义转换类型(处理时间类型)
1.定义转换器

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;

public class StringToDate  implements Converter<String,Date>{

	@Override
	public Date convert(String arg0) {
		// TODO Auto-generated method stub
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date = simpleDateFormat.parse(arg0);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
		return null;
	}
}

注解驱动添加

<!-- 注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
          <property name="converters">
              <set>
                  <bean class="com.wwj.convert.StringToDate"></bean>
              </set>
          </property>
      </bean>

将前面对象属性中提供的注解去掉即可

7.SpringMVC 控制器方法的返回值处理
在这里插入图片描述
8.SpringMVC 的跳转 (了解)

如果使用void 采用原生servletAPI中进行请求转发或重定向即可

使用springMVC提供的快捷方式

return “redirect: 资源路径 “;
return “forward: 资源路径 “;

@RequestMapping("/a6")
	public String login5(HttpServletRequest  req ,HttpServletResponse resp,Model  model){
			System.out.println(111);
			return  "redirect: main.jsp";
	}

重定向传值(了解,需要借助RedirectAttributes属性)

@RequestMapping("/a6")
	public String login5(RedirectAttributes  rs){
			rs.addAttribute("pname","wwj");
			return  "redirect: index.jsp";
	}

注意观察地址栏的变化

不想参数暴露

@RequestMapping("/a6")
	public String login5(RedirectAttributes  rs){
			//rs.addAttribute("pname","wwj");
		 	rs.addFlashAttribute("pname", "wwj");
			return  "redirect: index.jsp";
	}

然后新的请求接收值的时候 一定使用@ModelAttribute String pname

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值