您的位置:首页 > 编程语言 > Java开发

Spring学习(十)spring mvc入门

2015-09-01 22:17 429 查看

一、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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: