框架-spring入门总结

参考:

http://www.cnblogs.com/heavenyes/p/3908546.html

http://www.cnblogs.com/heavenyes/p/3908717.html

springmvc入门之HelloWorld篇

springmvc是一个基于spring的mvc框架,各种优点啥的用过就知道了.下面开始讲HelloWorldController的实现.

  1.开发环境搭建<导jar包+配置文件>

   1.1 新建web工程springmvc,导入springmvc所需的jar包,因为springmvc是基于spring的,所以必须包含spring的jar包,我用的版本是spring3.1.0.导入以下jar包:  

    

    1.2 配置web.xml   

      <!-- spring mvc配置 处理*.action和*.do请求 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载spring-servlet.xml配置文件,默认spring-servlet文件放在/WEB-INF目录下,为了便于管理,这里放到了src目录下 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> <!-- spring 配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>

    1.3 spring-servlet.xml配置

      springmvc启动会去/WEB-INF/目录下加载web.xml文件${servlet-name}-servlet.xml的配置文件,在web.xml文件中我们配置的servlet-name为spring,并且配置了spring-servlet.xml的路径为src目录下.

      spring建议我们把springmvc的配置放到${servlet-name}-servlet.xml,把service层的配置放到xxx-service.xml,把dao层的配置放到xxx-database.xml配置文件中,也就是把配置分散开来.下面就是spring-servlet.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- springmvc配置--> <!-- 自动扫描 -->
<context:component-scan base-package="cn.springmvc.controller"/> <!-- 视图解析类配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <!-- 如果返回的逻辑视图名为index,则视图解析器会找到webroot/jsps/index.jsp -->
          <property name="prefix">
<value>/jsps/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>

    1.4 配置applicationContext.xml,将spring的其他配置放到applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- spring 其他配置 --> </beans>

  ok,基本配置都完了,开始写Controller.

  2.HelloWorldController

    controller是springmvc中负责处理请求的核心组件,等价于struts2中的Action.下面我们开始编写HelloWorldController.

     package cn.springmvc.controller;

        import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller("helloWorldController") //--->beanName
@RequestMapping(value="/hello") // controller的映射路径
public class HelloworldController { @RequestMapping(value="/say")// 方法的映射路径
public String sayHello(){
System.out.println("hello");
return "hello";
} }

    现在就可以发布项目,然后输入url访问了:localhost:8080/springmvc/hello/say.action

  现在感受到springmvc的好处了吧,哈哈!简洁的配置真让人爱不释手!

  补充一点,struts2中的Action是prototype的,所以Action没有线程安全问题.springmvc中的Controller默认是单例的,如果controller可能产生线程安全问题,可以在Controller上加上@Scope("prototype")注解,告诉spring,每次请求都创建新的controller对象.

springmvc细节篇

前面讲了入门篇,现在来了解下springmvc的细节.mvc框架都有请求映射、数据绑定、请求处理、视图解析这几个过程,现在我们来了解springmvc中的这些细节。

1.使用@RequestMapping来配置springmvc请求映射的url

  springmvc中的请求映射有多种方式,当然用得最多的是基于注解的请求映射方式.开发中,我们中使用@RequestMapping这个注解来表示controller和方法的url.@RequestMapping的源码:

@Target({ElementType.METHOD, ElementType.TYPE}) // 注解可以用在类和方法上
@Retention(RetentionPolicy.RUNTIME)  // 注解在运行期有效
@Documented
@Mapping
public @interface RequestMapping {
  
String[] value() default {};
  
RequestMethod[] method() default {};
  
String[] params() default {};
  
String[] headers() default {};
  
String[] consumes() default {};
  
String[] produces() default {};
}

  其中value属性用来表示url,其他属性用于限定请求,也就是只有满足某些条件才处理请求.

  • value : 指定请求的实际地址,最常用的属性,例如:@RequestMapping(value="/xxx"),value的值可以以"/"开头,也可以不用"/",springmvc会自动补"/".
  • method: 指定访问方式,包括POST or GET or others...,默认都支持.以RequestMethod枚举来表示.

        例如:@RequestMapping(method=RequestMethod.POST)

  • heads: 限定request中必须包含的请求头

    例如:限定Content-Type @RequestMapping(headers={"Content-Type=application/x-www-form-urlencoded"})

  • consumes: 限定请求头中的Content-Type

    例如 : @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")该方法仅处理ContentType=application/json的请求

  • produces: 限定request中Accept

    例如:@RequestMapping(value = "/pets/{petId}", method =RequestMethod.GET, produces="application/json")该方法仅处理request中Accept包含application/json的请求

  consumes和produces用的比较少,其他几个属性比较常见.

  @RequestMapping使用的实例:

     @Controller
@RequestMapping(value="/hello")
public class HelloworldController { @RequestMapping(value="/say", //--> 请求url
method={RequestMethod.POST}, // 请求方式为 post
headers={"Content-Type=application/x-www-form-urlencoded"}, // 必须包含ContentType=application/x-www-form-urlencoded,普通表单提交
params={"name=xxx","email=yyy"}) // 请求中必须包含 name=xxx&email=yyy
//params={"name=xxx"})--->请求参数中必须包含
//headers={"Content-Type=application/x-www-form-urlencoded"}) --> 限制请求头
public String sayHello(){
System.out.println("hello");
return "hello";
} }

2.使用@RequestParam和@ModelAttribute完成数据绑定

  直白点说,就是如何接收request中的参数呢?springmvc的做法是在方法中定义形式参数,在调用方法时将request中参数赋值给对应的参数,通过注解来描述形参和request中参数的对应关系.

  简单例子,调用sayHello方法时,会传一个name参数.程序中如何接收呢?

@RequestMapping(value="/say")
public String sayHello(@RequestParam(value="nm",required=true,defaultValue="zzz")String name){ System.out.println("hello "+name); return "hello";
}

  RequestParam有三个属性:

  • value: 将request中value对应的参数值绑定到应用注解的变量上,对应上面的例子中:把request中nm的值传给name.
  • required:该参数是否必须,true:必须,request不包含此参数则抛异常
  • defaultValue:如果request中没有包含value参数,则使用defaultValue值绑定到变量

  如果request参数名称和方法中形参名字一样,代码上可以不声明@RequestParam,框架会自动注入.

  @RequestParam用来接收单个变量,如果我们要接收的是一个对象呢?例如User(name,email)对象.这时我们可以用另外一个注解@ModelAttribute.该注解的作用就是把request中参数绑定到一个对象上.

    @RequestMapping(value="process")
public String process(@ModelAttribute("user")User user){
System.out.println(user);
return "index";
}

  接收request的参数搞定了,那如何把数据放到request中,然后带回页面呢?这里有两种一种,一种就是通过ModelAndView对象,一种就是在方法中声明参数.前一种方法在之后视图解析时再说,这里我们将第二种方法.springmvc为解决这个问题提供了一种很优雅的方法,在方法声明Model或者Map的实例,把数据放到Model或者Map中(实际上Model中也是封装了一个Map,只不过Model是以接口的形式提供的),框架在执行方法时会把Model和Map的实例方法request中,这样就可以在页面上通过EL表达式取出页面显示了.这个过程在源码分析那篇中有提到.

    @RequestMapping(value="process")
public String process(@ModelAttribute("user")User user,Model model){
System.out.println(user);
       // 带参数到页面 jsp上${name}就可以取值
       model.addAttribute("name",user.getName());
return "index";
}
  
    @RequestMapping(value="process2")
public String process(@ModelAttribute("user")User user,Map<String,Object> result){
System.out.println(user);
       // 带参数到页面 jsp上${name}就可以取值
       result.put("name",user.getName());
return "index";
}
 

3.结果页面的返回

  请求处理过程就是调用url对应的方法完成请求的处理的过程,在源码分析篇详细分析了这个过程。这里我们直接讲结果页面的返回.springmvc中提供了一个ModelAndView对象封装结果视图。之前的处理中我们都是返回字符串形式的视图名称,这个字符串最终也会成为ModelAndView对象中的viewName属性,然后交由springmvc中结果视图组件解析.

  结果页面返回主要有转发和重定向两种方式,这部分直接看代码:

 

4. CharacterEncodingFilter

 web.xml文件中配置编码过滤器.GET方式的乱码问题可以设置tomcat的属性.

<!-- CharacterEncodingFilter 过滤器解决POST方式乱码问题 -->
<filter>
<filter-name>characterEncoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>

5.springmvc中的文件上传和下载

  springmvc文件上传使用的是apache的fileupload组件,所以在springmvc中使用文件上传时先要导入fileupload的jar包.还要在配置文件中配置文件上传的Resolver.

<!-- 文件上传配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>

  文件上传下载代码示例:

 

  页面代码:

 <h4>单文件上传</h4>
<form action="${pageContext.request.contextPath }/file/upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="file"/><br/>
<input type="submit" value="上传">
</form> <h4>多文件上传</h4>
<form action="${pageContext.request.contextPath}/file/uploads.action" method="post" enctype="multipart/form-data">
<input type="file" name="files"/><br/>
<input type="file" name="files"/><br/>
<input type="file" name="files"/><br/>
<input type="submit" value="上传">
</form>

6.springmvc中的json处理 

  讲springmv与ajax的整合前,先讲两个注解.

  @RequestBody:将http请求中的正文(请求体)赋值给应用了注解的参数,通过这个注解可以直接获取请求体的内容.需要注意的是:post请求才有请求体.

  @ResponseBody:将数据作为response的正文(响应体)返回.用这个注解可以直接把方法的返回值写到response对象中.通常用于完成ajax请求后服务端数据的返回.

  先看两个注解的应用代码:

 

页面代码:

 

  上面说了,@RequestBody和@ResponseBody的作用.接下来使用这两个注解来处理json数据.下面程序的json转换用的是fastjson.

  用@ResponseBody返回json字符串.代码如下:

   /**
* 用@ResponseBody返回json字符串
*/
@RequestMapping(value="retJson")
@ResponseBody
public String retJson(@RequestParam("userId")Integer userId){
System.out.println("userId>>>>>>>>>>>>>>:"+userId);
User user = new User(); // get User from db by userId
user.setName("zhangsan");
user.setEmail("zhangsan@126.com");
// 返回json字符串
String json = JSON.toJSONString(user);
return json;
} 页面代码:
function _retJson(){
var url = '${pageContext.request.contextPath}/ajax/retJson.action';
var param = {userId:1};
$.post(url,param,function(data){
alert(data);
var user = eval("("+data+")");
alert(user.name+"..."+user.email);
});
}
<button onclick="_retJson();">retJson</button>

  @RequestBody接收json字符串,@ResponseBody返回json字符串.  

     /**
* 用@RequestBody接收json字符串,用@ResponseBody返回json字符串
*/
@RequestMapping(value="doJson")
@ResponseBody
public String doJson(@RequestBody String jsonStr){
System.out.println("requestbody>>>>>>>>:"+jsonStr);
     // json字符串 转成对象
User user = JSON.parseObject(jsonStr,User.class);
user.setName("_"+user.getName());
user.setEmail("_"+user.getEmail());
     // 对象转成json字符串
String retStr = JSON.toJSONString(user);
return retStr;
}
页面代码:
function _doJson(){
// 获取参数值,拼接json字符串
var name = $("#name").val();
var email = $("#email").val();
// json对象
var json = {name:name,email:email};
// json对象转成json字符串
var jsonStr = JSON.stringify(json);
/**
* 也可以手动拼接json字符串
var jsonStr = "{\"name\":\""+name+"\",\"email\":\""+email+"\"}";
*/
var url = '${pageContext.request.contextPath}/ajax/doJson.action';
//因为发送的json字符串,要设置 Content-Type=application/json
$.ajaxSetup({
contentType:'application/json;charset=UTF-8'
});
// 发送请求
$.post(url,jsonStr,function(data){
alert(data);
// json字符串转json对象
var user = eval("("+data+")");
alert(user.name+"..."+user.email);
});
} <input type="text" name="name" id="name"><br/>
<input type="text" name="email" id="email"><br/>
<button onclick="_doJson();">doJson</button>

@ResponseBody乱码问题的解决,springmvc中StringHttpMessageConverter类默认用的是ISO8859-1编码,所以用@ResponseBody返回中文时会产生乱码问题.解决办法是基于StringHttpMessageConverter写一个Converter,该编码为UTF-8.

import java.nio.charset.Charset;

import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter; public class MyStringConvert extends StringHttpMessageConverter{
private static final MediaType mt = new MediaType("text","html",Charset.forName("UTF-8"));// text/html;charset=utf-8
@Override
protected MediaType getDefaultContentType(String t) {
return mt;
}
}

  声明AnnotationMethodHandlerAdapter使用自定义的converter.在spring-servlet.xml中配置:

   <!-- @ResponseBody返回中文乱码问题 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters" >
<bean class="cn.jack.util.MyStringConvert"></bean>
</property>
</bean>

框架-spring入门总结的更多相关文章

  1. Spring框架---Spring入门

    Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...

  2. JAVA框架 Spring 入门

    一.阐述: IoC:我们以前写的框架虽然我们已经进行分层,web.业务层.持久层.但是各个层之间的关系.耦合性比较高,那个层调用其他层的时候,需要new对应层的类的对象,这样的话,我们以后做修改的时候 ...

  3. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  4. Spring框架(1)---Spring入门

    Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...

  5. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

  6. JavaWeb_(Spring框架)Spring中IoC与DI概念入门

    Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spri ...

  7. [Spring框架]Spring开发实例: XML+注解.

    前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...

  8. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  9. Spring入门学习(一)

    SpringMVC基础平台补充(2016.03.03) 如果想要开发SpringMVC,那么前期依次安装好:JDK(jdk-8u74-windows-x64,安装后配置环境变量JAVA_HOME和CL ...

随机推荐

  1. ansible的入门级使用

      author: headsen  chen   date: 2018-08-02   11:46:35 1,ansible的安装 yum install epel-release yum -y i ...

  2. linux 中怎样返回上一层目录的命令?

    可以使用cd命令,cd命令的功能是切换到指定的目录:命令格式:cd [目录名]目录名有几个符号有特殊的含义,“..”代表上一级目录.“~”代表HOME目录.“-”代表前一目录.因此返回上一级目录可以使 ...

  3. hdu4975 网络流解方程组(网络流+dfs判环或矩阵DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4975 A simple Gaussian elimination problem. Time Limit: 20 ...

  4. postgresql----数据库表约束----PRIMARY KEY

    五.PRIMARY KEY ---- 主键约束 主键可以是单个字段,也可以是多个字段的组合.主键约束其实是UNIQUE和NOT NULL约束的组合,即主键必须是唯一,且各字段都是NOT NULL的. ...

  5. Linux登录失败处理功能

     本文要实现的功能:如果有人恶意尝试破解你的服务器密码,那么这个功能就能帮你起到一定的作用,当尝试密码错误超过设定的次数后,就会锁定该账户多长时间(自行设定),时间过后即可自行解锁,这样可以增加攻击者 ...

  6. EasyUI DataGrid 时间格式化、字符串长度截取

    需要格式化日期时间和标题的方法,显示如下: 日期:2017-03-03 时间:2017-03-0 11:11 标题:标题名称 <table id="tbList" style ...

  7. pandas的merge方法

    数据合并时可以使用merge方法,对两个dataFrame根据某一个series合并,这个方法非常好用,只要找到了合并的标准,新的数据就可以重构出来. 1.命令: pd.merge() on:列名,j ...

  8. What Powers Instagram: Hundreds of Instances, Dozens of Technologies(译文,转)

    add by zhj: 对译文略有修改.原文发表时,Instagram还没被Facebook收购,读完只感觉Instagram这三个后台工程师真牛逼. 三个人就可以搞定1400万注册用户.不过,另一方 ...

  9. docker 离线环境安装oracle

    因测试需要,需在内网的测试环境搭建一套docker Oracle 11g环境进行测试,测试环境为redhat 6.6 安装docker 1.7,本机windows 7 环境,安装docker 17.1 ...

  10. logging.basicConfig参数简介

    通过logging.basicConfig函数对日志的输出格式及方式做相关配置 import logging logging.basicConfig(level=logging.DEBUG, form ...