今日知识

1. SpringMVC入门
2. SpringMVC的注解开发

SpringMVC入门

1. 简介:
* Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
* Sping MVC 主要由DispatcherServlet,处理器映射【找控制器】、适配器【调用控制器的方法】、控制器【业务】、视图解析器、视图组成。
2. 入门案例
1. 导包:
* spring-webmvc.jar和log4j.jar和servlet.jar
2. web.xml配置DispatchServlet
* <servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3. 配置WEB-INF/DispatcherServlet-servlet.xml
* <!--配置处理器映射
BeanNameUrlHandlerMapping:根据bean的name属性的url去找handlerController
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置适配器执行Controller-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置一个控制器-->
<bean name="/user.do" class="com.rqy.controller.UserController"/>
<!--配置springmvc视图解析器
视图解析器解析的视频路径为:前缀 + 后缀
spring会自动拼接路径
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
4. UserController处理页面请求com.rqy.controller.UserController
* public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//返回jsp视图
ModelAndView mv = new ModelAndView("user/userList");
//设置数据,让jsp页面获取
mv.addObject("name","任清阳");
return mv;
}
}
5. 视图层配置WEB-INF/views/user/userList.jsp
* ${name}

Url处理器映射

1. BeanNameUrlHandlerMapping
* 功能:寻找Controller
* 根据url请求去匹配bean的name属性,从而获取Controller
* 案例
* <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置处理器适配器执行Controller-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置一个控制器-->
<bean name="/user.do" class="com.rqy.controller.UserController"/
2. SimpleUrlHandlerMapping
* 功能:寻找Controller
* 根据浏览器url匹配简单url的key,key就是Controller的id找到Controller
* 案例
* <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/user1.do">userController</prop>
</props>
</property>
</bean>
<!--配置处理器适配器执行Controller-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置一个控制器-->
<bean id="userController" class="com.rqy.controller.UserController"/>
* 测试路径
* http://localhost/user1.do
3. ControllerClassNameHandlerMapping
* 功能:寻找Controller
* 根据类名(MyController)类名.do来访问,类名首字母小写
* 类名全部小写也可以,写一半也可以
* 案例
*
* 测试路径
* http://localhost/userController.do
*

处理器适配器

1. SimpleControllerHandlerAdapter
* 功能:执行controller
* 调用controller里面方法,返回modelAndView
* <!--配置处理器适配器执行Controller-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
* <!--配置一个控制器-->
<bean name="/user.do" class="com.rqy.controller.UserController"/>
* UserController实现Controller接口
* public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//返回jsp视图
ModelAndView mv = new ModelAndView("user/userList");
//设置数据,让jsp页面获取
mv.addObject("name","任清阳");
return mv;
}
} 2. HttpRequestHandlerAdapter
* 功能:执行controller
* 负责调用实现HttpRequestHandler接口的控制器
* <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
* <bean name="/http.do" class="com.rqy.controller.HttpController"/>
* HttpController应该实现HttpRequestHandler接口
* public class HttpController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name","任清阳11");
request.getRequestDispatcher("/WEB-INF/views/user/userList.jsp").forward(request,response);
}
}
* 注意:两个处理器适配器可以共存

命令控制器

1. springMVC通过设计模式接收页面的参数
2. Command控制器
1. 创建useradd.JSP from表单提交给commend.do处理
2. xml配置
* <bean name="/command.do" class="com.rqy.controller.CommandController"/>
3. CommandController类创建
* public class CommandController extends AbstractCommandController {
public CommandController(){
//指定bean来接收参数
this.setCommandClass(User.class);
}
@Override
protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
//装换为用户对象
User user= (User) o;
//打印参数
System.out.println(user);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
//返回jsp页面
modelAndView.setViewName("user/info");
return modelAndView;
}
}
4. info.jsp用于数据显示

SpringMVC注解开发

1. xml配置
* web.xml配置(指定接收请求的url的配置文件)
* <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application2.xml</param-value>
</init-param>
* application.xml配置
* <mvc:annotation-driven/>代替了处理器和适配器
<!--设置注解扫面范围-->
<context:component-scan base-package="com.rqy.controller"/>
<!--配置springmvc视图解析器
视图解析器解析的视频路径为:前缀 + 后缀
spring会自动拼接路径
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
2. 控制器的类需要声明
1. @Controller
* //相当于在xml配置控制器路径,<bean name="/useradd.do" class="com.rqy.controller.UserController"/>
2. @RequestMapping("/user"),代表资源路径
3. 方法还可以指定资源路径,访问的之后需要将类名和方法名上面的资源路径拼接访问
* @RequestMapping("/list")
4. 访问路径=/user/list
5. 注解的多种方式
@RequestMapping(value="list",params={"username","password"})
@RequestMapping(“/list”)
@RequestMapping(value={“list”,"list1"})//多个请求映射到同一个方法
//一个Url映射到不同的方法上:通过请求方法的限定来实现的:
@GetMapping("uniqueUrl")
@PostMapping("uniqueUrl")
@RequestMapping(“/list.do”)
@RequestMapping(value=”/list.do”)
@RequestMapping(value = "/list3",method=RequestMethod.POST) 只能使用POST方法
@RequestMapping(value = "/list3",method=RequestMethod.Get) 只能使用GET方法

接收请求参数的方法

1. 接收int,String,Date,数组类型
* 直接在对应的方法中用参数来接收
2. 接收pojo类型
* 表单name标签正常写,与类对象属性名保持一致
* 参数用对象接收 :login(User user)
* 自动封装
3. 接收包装类型参数
* 把User写成(UserExt)属性类:User user
* 参数用对象接收 :login(UserExt user)
* 表单写法user.username
4. 接收集合List类型参数
* 在UserExt扩展中添加一个集合:List<User> userList
* 参数用对象接收 :login(UserExt user)
* 表单写法name=userList[0].username,userList[0].password
* 可以同时注册两个用户:userList[1].username
5. 接收集合Map类型参数
* 在UserExt扩展中添加一个Map:Map<String,Object> map
* 参数用对象接收 :login(UserExt user)
* 表单写法name=map['username'],name=map['password']
6. Date数据的处理,配置之后,默认所有的提交的Date数据,都会被格式化
1. 格式化方法类
public class StringDateConverter implements Converter<String,Date>{
@Override
public Date convert(String value) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); try {
//将字符串格式化为时间类型
Date parse = sdf.parse(value);
return parse;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
2. xml的配置
<!--注册的转化工具类-->
<mvc:annotation-driven conversion-service="MyConversionService"/>
<!--注册转换工具类-->
<bean id="myStringDateConverter" class="com.rqy.converter.StringDateConverter"/>
<bean id="MyConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!--<bean id="myStringDateConverter" class="com.rqy.converter.StringDateConverter"/>
-->
<ref bean="myStringDateConverter"/>
</set>
</property>
</bean>
3. jsp页面
<h1>时间类型的处理</h1>
<form action="${pageContext.request.contextPath}/user/submitDate" method="post">
生日:<input type="text" name="birthday"><br>
<input type="submit">
</form>
4. 接收请求的方法的
//时间类型转换
@RequestMapping("/submitDate")
public String submitDate(Date birthday){
System.out.println(birthday);
return "stu/success";
}

SpringMVC与Struts的区别(面试题)

1. 实现机制
* Struts2基于过滤器实现
* SpringMVC基于servlet实现
2. 运行速度
* servlet比过滤器块
* Struts是多例的
* 每一次请求,都会创建一个Action对象
请求来了以后,struts2创建多少个对象:ActionContext,valuestack,UAction,ActionSuport,
* SpringMVC是单例的: 同一个Controller请求,只会创建一个Controller
*
3. 参数封装
* Struts基于属性进行封装,Action有参数属性
* SpringMVC基于方法封装,参数写在Controller的方法

页面回显

1. 将集合赋值,同时方法里面加入参数Model model
2. model.addAttribute("userList",list);
3. return "user/info";转发到页面进行EL表达式进行展示

URL模板映射

1. url模版映射可以restfull软件架构
2. <a href="${pageContext.request.contextPath}/rest/user/edit1/${user.id}">编辑</a>
3. {}:匹配接受页面Url路径参数
* @RequestMapping("/edit1/{id}")
public String list3(@PathVariable Integer id,@RequestHeader("Aspect") String aspect, Model model){
//{id} == id
System.out.println(id);
return "user/info";
}
4. @RequestHeader("Aspect"):获取请求头的参数信息

转发和重定向(转发到指定方法中)

1. 转发
* 转发到同一个容器(user容器)
* return "forward:list.do"
* 转发到不同的容器(stu容器)
* return "forward:/user/list.do"
2. 重定向,只需要把forward改成redirect
* return "redirect:/user/list.do"
3. 代表直接转发到某个页面:return "user/userList";
4. 转发到某个页面时候:/user 代表相对于webapp的资源路径,
不加/, user,代表相对于注解的资源路径(会自动把注解路径拼接上导致报错)
5. 实例
单级url:
forward和direct:访问(不)同一个容器资源加或不加“/”都可以
多级url中:
1. 访问同一个容器资源
forward:不包含“/”,访问同一个容器资源ok
forward:包含“/”,访问同一个容器资源出错404
direct:加“/”,访问同一个容器资源,根目录路径会消失,变成localhost/hello,期望的是localhost/user/hello
direct:不加“/”,访问同一个容器资源,ok,与期望值一样:localhost/user/hello
总结:访问同一个容器的时候,无论forward或者direct,都不要加“/”
举例: return "forward:hello";
return "redirect:hello"; 2. 访问不同一个容器资源
forward:包含“/”,访问不同一个容器资源ok
forward:不包含“/”,访问不同一个容器资源出错404
direct:不加“/”,访问不同一个容器资源,根目录路径会消失,变成localhost/user/stu/hello,期望的是localhost/stu/hello
direct:加“/”,访问不同一个容器资源,ok,与期望值一样:localhost/stu/hello
总结:访问不同一个容器的时候,无论forward或者direct,都要加“/”
举例: return "redirect:/stu/register";
return "forward:/stu/register";

RequestParam

1. RequestParam参数描述
* value:参数名称
* defaultValue:默认值
* required:参数是否必须有值,如果为true,参数又为空,会报错
* 举例;
* public String list3(@RequestParam(value = "uid",required = true,defaultValue ="1")Integer uid)

07-SpringMVC01的更多相关文章

  1. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  2. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  3. 《HelloGitHub月刊》第07期

    最近工作上的事比较多,<HelloGitHub>月刊第07期拖到月底才发. 本期月刊对logo和月刊的排版进行了优化,不知道大家的反馈如何,还望大家多多反馈,让<HelloGitHu ...

  4. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  5. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  6. NPOI 导入导出excel 支持 03 07

    因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...

  7. Archlinux 2015.07.01 和 Windows7 双系统 安装教程

    提前在windows7下给Archlinux预留一个分区,大小最好在20G以上(根据自己硬盘情况分配). 第一步,安装前的准备 从arch官网下载最新的ISO文件archlinux-2015.07.0 ...

  8. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  9. AC日记——有趣的跳跃 openjudge 1.6 07

    07:有趣的跳跃 总时间限制:  1000ms 内存限制:  65536kB 描述 一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1). ...

  10. AC日记——配对碱基链 openjudge 1.7 07

    07:配对碱基链 总时间限制:  1000ms 内存限制:  65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成.而构成DNA的碱基共有4种,分别为腺瞟呤(A).鸟嘌 ...

随机推荐

  1. 使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)

    前言 微信群机器人,主要用来管理群聊,提供类似天气查询.点歌.机器人聊天等用途. 由于微信将web端的协议封杀后,很多基于http协议的群聊机器人都失效了,所以这里使用基于PC端协议的插件来实现. 声 ...

  2. php5.6.39 源码安装

    1 安装依赖库 yum install -y autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel li ...

  3. 【UEFI】---记录一次debug过程中的调试经验

    最近在调试一次SMBIOS的动态更新以及I2c设备的配置读取时,遇到了很多问题,特此总结: 1. 第一个是调试一个I2c设备的时候,遇到了一个很奇怪的问题,也由此问题总结了下SMBUS模块的知识,如下 ...

  4. 用PHP写下HELLO WORLD!

    一.选择PHP开发工具 1.phpstorm最新版本 2.打开phpstorm界面 按create键,选择new window ,出下如下页面: 鼠标放在文件夹上,右键单击,弹出以下对话框:做如下操作 ...

  5. transient简介

    当一个对象实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的 ...

  6. 13.系统总结static

    static修饰属性和方法: package com.oop.demo08; //static :被static修饰的变量或者方法随类加载,从属于类,当然对象也可以调用 public class St ...

  7. 7.JavaSE之类型转换

    类型转换: 由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换. 图中优先级从低到高,小数优先级大于整数. 运算中,不同类型的数据需要转换为同一类型,然后进行运算. 强制类型转换:(类型 ...

  8. .net core 第三方工具包集合

    日志 Nlog 单点登录

  9. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  10. 机器学习-K最近邻算法

    一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...