Spring框架学习(7)spring mvc入门
内容源自:spring mvc入门
一、spring mvc和spring的关系
spring mvc是spring框架提供的七层体系架构中的一个层,是spring框架的一部分,是spring用于处理客户端请求的MVC工具,取代表现层框架struts1/2。在使用时,spring mvc和spring框架的使用方式是相互独立的。spring mvc是脱离了spring框架的单独的表现层框架。
二、如何在web工程中添加spring mvc?
web工程添加spring框架的方式和添加springmvc的方式不同的
如果在工程中同时使用 spring框架 和 springmvc框架,需要在web.xml中同时注册两个类分别加载这两个框架
注册spring时 web.xml ContextLoaderListener 监听器
注册spring mvc框架 为了使用这个框架处理客户端请求 注册的同时为这个框架设置其需要处理的请求格式 *.do *.action *.etoak...
struts1 ActionServlet <servlet> <Servlet-mapping><url-pattern> *.do
struts2 StrutsPrepareAndExecuteFilter <filter><filter-mapping><url-pattern> *.action
注册spring框架 ContextLoaderLIstener <listener> <listener-mapper>
监听器无法为spring框架设置其需要处理的请求格式
注册spring mvc ,就需要为其设置处理的请求格式 就需要使用另外一个类代替监听器
DispatcherServlet extends HttpServlet <servlet> <servlet-mapping>
三、spring-mvc请求处理的基本流程
spring-mvc处理请求的方式 : 非注解版(2.0及之前版本)、注解版(2.5之后)
a 客户端提交hello.do请求,将请求提交到web.xml(web容器),被web容器 中注册的DIspatcherServlet拦截到;DispatcherServlet将其拦截到的所有请求转发给ioc容器中注册的请求解析器
b spring-mvc为了实现对请求的解析提供了两种请求解析器 : 字符/字节
字符解析器提供了一个HandlerMapping接口,可以使用它提供的任何一个实现类实现对请求的解析。在该接口中,提供了两个默认的请求解析器:SimpleUrlHandlerMapping /DefaultAnnoationHandlerMapping 具体使用哪一个,取决于当前的ioc环境是否是注解环境
将ioc环境设置为注解环境的方式 : context:component-scan 扫描包结构。
请求解析器解析请求的方式都不一样,但是解析的结构是相同的:
获取表示请求的字符串 “/hello”
c 根据解析的字符串,在ioc容器中查找用于处理请求的请求处理器
[struts1=Action struts2=ActionSupport]
spring-mvc提供的请求处理器需要实现Controller接口
1 创建一个实现了Controller接口的类作为spring-mvc的请求处理器,处理请求
2 将其配置成ioc容器中的bean
@Controller
使用该注解标注的类会成为ioc容器实例化的对象
相当于手动在ioc容器中配置一个bean
提供了一个其他注解(@Compeont @Service @Repository)不具备的功能
被该注解标注的类会自动实现Controller接口,成为spring-mvc的请求处理器。
创建一个使用@Controller注解标注的类 - 请求处理器 - 处理/hello请求
四、spring mvc表单项封装
提供一个第三方javaBean,封装请求中的表单项。将封装有表单项的javaBean添加到处理请求方法的第一个参数中。
特例 : 当提交请求中仅有一个表单项时,并且该表单项的类型为基本数据类型或者String类型 ; 表单项的封装 可以直接使用处理请求方法的第一个参数进行。而无法再提供一个javaBean。
五、中文乱码
产生原因 : 客户端( utf-8)和服务器( iso-8859-1)使用的编码不一致
解决方式 :
1 软编码
修改请求、响应中的编码格式
限制条件 : 什么情况下使用软编码无效?
1 get 2 上传、下载
在使用软编码解决中文乱码时,必须确保修改编码的位置在表单项封装之前!
2 硬编码
以新的编码方式组装一个新的字符串
spring-mvc :使用软编码方式, 重写中央控制器 DispatcherServlet
六、servlet-API交互
HttpServletRequest HttpServletResponse HttpSession ServletContext..
servlet-API范围 (request session application) 提供了类似struts2的方式,范围封装在map对象
Map map=ActionContext.getContext().get("request/session/application")
ModelMap implements Map
@SessionAttributes(String[] attrs)
该注解用于标注一个类(请求处理器)
使用该注解时,需要为其提供String类型数组
数组中指向添加到ModelMap中的数据key
将这些数据复制一份转存在session范围。
七、示例程序:
页面:
<a href="hello.do">helloworld</a> <form action="login.do" method="post"> 登录名:<input type="text" name="loginname"/><br/> 密码: <input type="password" name="password"/><br/> <input type="submit" value="登录"/> </form>
web.xml:
加载spring中央控制器并拦截 .do请求
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 注册一个web容器启动时负责加载springmvc的中央控制器:DispatcherServlet, 这里我们使用软编码的方式,重写了spring mvc提供的DispatcherServlet中的doService()方法,所以<servlet-class>值为自己写的那个类 DispatcherServlet作用: 1 代替ContextLoaderListener加载springmvc框架 [spring和springmvc使用的配置文件都是 ioc容器] 2 设置spring mvc允许处理的请求格式,防止乱码 --> <servlet> <servlet-name>etoak</servlet-name> <servlet-class>com.etoak.util.MyDispatcherServlet</servlet-class> <!-- 如果不写<init-param>contextConfigLocation 默认值 : /WEB-INF/etoak-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>etoak</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!-- 请求解析器: spring-mvc中提供了两种负责解析请求的解析器: 字符请求解析器 HandlerMapping接口 spring-mvc为了解析字符请求提供了两个默认的请求解析器: SimpleUrlHandlerMapping 非注解环境下默认的 DefaultAnnotationHandlerMapping 注解环境下默认的 字节请求解析器[上传请求解析器] MultipartResolver接口 解析请求的方式不同,但是解析结果都是一样的: 获取表示请求的字符串 /hello --> <context:component-scan base-package="com"/> </beans>
HelloController.java
处理请求
/** * 业务逻辑层 * servlet XxServlet com.etoak.servlet * struts1/2 XxAction com.etoak.action * spring-mvc XxController com.etoak.controller */ @Controller @SessionAttributes({"user"}) public class HelloController { /** "/hello" * 请求和处理之间的映射关系形成? * @RequestMapping(path) * 该注解用于标注请求处理器中的一个方法; * 使用该方法处理path指向的请求 */ @RequestMapping("/hello") public String hello(){ System.out.println("处理客户端提交的hello.do请求"); /** * 为客户端返回一个响应视图 * 返回响应视图的方式 : 处理请求方法的返回值(String) * 返回视图的形式 : 重定向 redirect | 转发 forward */ return "redirect:success.jsp"; // return "forward:/success.jsp"; } @RequestMapping("/login") public String login(User user){ // 表示使用User类型的一个user对象,封装当前请求中的表单项 /* 硬编码方式防止乱码: String loginname = user.getLoginname(); try { loginname = new String( loginname.getBytes("iso-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ System.out.println("loginname-->"+user.getLoginname()); System.out.println("password-->"+user.getPassword()); return "forward:success.jsp"; } @RequestMapping("/selectUserById") public String selectUserById(Integer id , ModelMap map){ System.out.println("id-->"+id); User user = new User("sheldon","111"); /** 存储在request范围中 * 将user添加到ModelMap对象中 * 添加到ModelMap中的数据 默认 是存储在request范围中 */ map.put("user", user); // request.setAttribute("user",user); return "forward:success.jsp"; } }
MyDispatcherServlet.java
软编码控制编码格式:
public class MyDispatcherServlet extends DispatcherServlet { //软编码: 重写DispatcherServlet中的doService方法来控制请求编码格式 @Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub request.setCharacterEncoding("utf-8"); super.doService(request, response); } }
User.java
public class User { private String loginname; private String password; public User(String loginname, String password) { super(); this.loginname = loginname; this.password = password; } public String getLoginname() { return loginname; } public void setLoginname(String loginname) { this.loginname = loginname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Spring框架学习(7)spring mvc入门的更多相关文章
- Spring框架学习03——Spring Bean 的详解
1.Bean 的配置 Spring可以看做一个大型工厂,用于生产和管理Spring容器中的Bean,Spring框架支持XML和Properties两种格式的配置文件,在实际开发中常用XML格式的配置 ...
- Spring 框架学习(1)--Spring、Spring MVC扫盲
纸上得来终觉浅,绝知此事要躬行 文章大纲 什么是spring 传统Java web应用架构 更强的Java Web应用架构--MVC框架 Spring--粘合式框架 spring的内涵 spring核 ...
- Spring框架学习02——Spring IOC 详解
1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用 ...
- spring框架学习(一)入门
spring 入门--IOC 1.导入jar包 4 + 1 : 4个核心(beans.core.context.expression) + 1个依赖(commons-loggins...jar) ...
- Spring框架学习1
AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理 Spring框架学习(一) 阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...
- Spring框架学习笔记(5)——Spring Boot创建与使用
Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...
- Spring框架学习总结(上)
目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...
- Spring框架学习笔记(1)
Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- spring框架学习(三)junit单元测试
spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...
随机推荐
- Python实例 | 贴吧签到
第一步 查看HTTP请求的内容 首先需要通过浏览器或者其他http包分析软件来观察,签到的时候进行了什么请求. Firefox浏览器就足以做到这一点,Wireshark是更加专业的包分析软件,它除了能 ...
- AC日记——Power收集 洛谷 P3800
Power收集 思路: 单调队列优化dp: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 stru ...
- ASP.NET MVC5(一)—— URL路由
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 风情万种awk
awk是基于列的文本处理工具,所有的文件都是由单词和各种空白字符组成.这里"空白字符"包括空格.tab以及连续的空格和tab,每个非空白的部分叫做"域",从左到 ...
- TCP握手协议简述
TCP握手协议简述在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器 ...
- MyBatis插入时候获取自增主键方法
方法一:(Oralce不支持这种写法) useGeneratedkeys 默认值为 false,含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty ...
- HDU 6463.超级无敌简单题-卡边界的暴力 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
超级无敌简单题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Linux操作命令(五)
find . -name ”*.c" -exec ./command.sh {} \; 本次实验将介绍 Linux 命令中 find 和 xargs 命令的用法. find xargs 1. ...
- 在mac上无法使用Android Studio的解决方法
随着android Studio 1.0的正式发布,估计使用的人会越来越多,并且官网上现在已经没有融合好的eclipse下载了,官方推荐下载android Studio.之前的beta版我也安装过,好 ...
- 第7天-javascript内置对象
数组相关方法 concat 用来连接多个数组 <script> var a = [1,2,3]; var b = [3,4,5]; var c = a.concat(b); console ...