4、Spring MVC实操

springMVC的上下文层级关系:
一种是与SpringMVC核心相关的,也就是Dispatcherservlet上下文,作用只是负责与SpringMVC业务相关的功能,比如HandlerMapping、Controller、ViewResolver等等,另外一种就是供所有组件调用的公共的应用程序上下文,这一部分一般是由Spring的ContextloadListener加载管理的,可以加载多个,比如controller层、service层、Dao层等等,以便于业务扩展时,可以复用ContextloadListener加载管理的组件。
这两个配置文件都需要在web.xml中进行配置。
在springmvc配置文件中,<context:annotation-config></context:annotation>意思是激活spring基于注解配置的依赖注入和控制反转,可以使用注解注入

web.xml  所有的web项目都要有的最最基本的配置文件。所有框架监听器 servet都在这里配置。Maven默认建立的是2.3版本,不支持EL表达式,要修改成2.4版本。

mvc-dispatcher-servlet.xml 配置Spring MVC的 就是控制层的相关配置。类似Struts2框架的struts.xml,当然配置方式不同。

applicationContext.xml这个是Spring Bean容器的配置文件,IOC :依赖注入  AOP :面向切面相关的配置。IOC主要是管理全局对象的,比如session  dao  service 之类的。AOP 面向切面起到过滤器的作用,一般用作事务管理。

整合Spring,在web.xml中加入Spring相应配置
WebApplicationContext(s)是ContextLoader加载的公共组件如:service
存在多个DispatcherServlet,分发不同的请求
springmvc.xml中
<context:annotation-config/> //启用Spring基于annotation的DI
<context:component-scan>
  //只管理Controller类
  <context:include-filter type="annotation" expression="org.springframework.steretype.Controller"/>
</context:component-scan>
//默认配置HandlerMapping
<mvc:annotation-driver/>//将请求参数绑定到控制器参数
<mvc:resources mapping="/resources/**" location="/resources/">//静态资源配置
//配置ViewResolver,InternalResourceViewResolver需要放在最后


Spring上下文相关的配置文件:
<context:annotation-config/> //启用Spring基于annotation的DI
<context:component-scan>
  //过滤Controller类,因为被其他springmvc管理着
  <context:exclude-filter type="annotation" expression="org.springframework.steretype.Controller"/>
</context:component-scan>


Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。

//传递参数到视图层
//参数名,即为变量名
public String viewCourse(Integer courseId,Model model){
  Courese course = new Course();
  model.addAttribute(course);
  return "view";
}

jsp中的el表达式 ${course.title} 中的course是controller中setAttribute或addAttribute以及带泛型的model的put方法

Controller-现代方式
// 本方法将处理 /view?id=123
@RequestMapping(value="/view",method=RequestMethod.GET) //只处理get请求
public String view(@RequestParam("id") String id,Model nodel)//绑定参数


//处理 /view/{id} 
@RequestMapping(value="/view/{id}",method=RequestMethod.GET) 
public String view(@PathVariable("id") String id,Map<String,Object> map)

1.在命令窗口中输入:mve jetty:run
   启动后,在浏览器输入:localhost:8080/courses/view?courseld=123  回车运行
2.在命令窗口中输入:mve jetty:run
   启动后,在浏览器输入:localhost:8080/courses/view2/345  回车运行

Model是Spring MVC中特有的类.


Model类有addAttribute(Object obj)方法,用来把对象保存在Model对象之中,最后可以在返回的页面中用el表达式通过保存在Model的对象其所属类的类名(第一个字母小写)来获取到对象.


Model类还有addAttribute(String s,Object obj)带两个参数的方法.通过key-value形式保存.


@RequestMapping注解标注在方法上时,还有method属性,用来指定只处理get请求类型还是post类型.不设置的话则两种请求类型都会处理.


<mvc:annotation-driven></mvc:annotation>标签的作用可以将请求参数绑定到控制器参数中.


使用@RequestParam注解将页面请求参数绑定到控制器中方法的参数.
该注解标注在方法的参数中,注解中填写请求参数的参数名即可.


<input type="text" name="username"/>


@RequestMapping(value="/mvc" method=RequestMethod.POST})
public String say(@RequestParam("username") String username){

}

//即可获得req,session对象
@RequestMapping("/view3?courseID=123")
public String view(HttpServletRequest req,HttpSession session)

springMVC传递参数的三种方式:
1)使用参数注解@RequestParam
url形式:http://host:8080/courses/view?courseID=123
controller参数中传入:@RequestParam("courseID") Integer courseID

2)使用路径变量注解@PathVariable
url形式:http://host:8080/courses/view2/{courseID}
方法的requestMapping:@RequestMapping(value="/view2/{courseID}",method=RequestMethod.GET)
controller参数中传入:@PathVariable("courseID") Integer courseID

3)使用传统的从HttpServletRequest获取参数
url形式:http://host:8080/courses/view3?courseID=123
controller参数中传入HttpServletRequest,使用request.getParameter("key")来获取参数值。

通过Controller、Annotation声明了一个Controller。
通过RequestMapping(类级别和方法级别二者结合)映射了URl和方法。
通过URL template, 结合使用@PathVariable和@RequestParam两个标记,可以将URL路径之中的参数绑定到Controller的Method中的入参。
使用HttpServletRequest或HttpSession获取相关属性。


模型对象与页面数据的绑定


前台表单:
<form action="<%=path%>/hello/save?add" method="post">


<input type="text" name="username" />


<input type="text" name="password"/>


<input type="submit" value="提交"/>


</form>


建立一个模型类,模型类中的属性名需要跟表单中提交的name值一致.


public class User {
    
private int userid;
  
private String usernmae;


private String password;


生成get/set方法.


}


编写Controller:


@Controller
@RequestMapping("/hello")
public class control{

@RequestMapping(value="/sava",method=RequestMethod.POST,params="add")
public String test(@ModelAttribute User user){


    user.setUserid(1);

    return "xxx";
}
}


@ModelAttribute注解标注在方法的入参中,作用是标记为模型对象.
(当传递的参数仅有一个,使用@ReqeustParam注解标注方法入参即可.此处不需要使用)


那么前台页面提交过来的参数就会根据name值自动赋值到user对象中的相应属性中(@ModelAttribute注解可以省略不写)


@RequestMapping注解可以使用params属性,来限制访问的条件.


@RequestMapping(value="/mvc" params="add")
public String test(){
return "xxx"
}


那么请求路径必须是http://locahost:8080/项目名/hello/mvc?add的url才能到达该方法.

Servlet中:


请求重定向:response.sendRedirect("url");


请求转发:request.getRequestDispatcher("url").forward(request,response);


在Spring MVC提供了非常简便的方式实现请求重定向与转发的操作,直接在Controller的方法中返回字符串即可.


请求重定向:return "redirect:url" 


请求转发:return "forward:url"


请求重定向或请求转发到Controller的其他方法中.




@RequestMapping("/login")
public String login(){


return "view1"


}




@RequestMapping("/mvc")
public String test(){


return "redirect:/hello/login";


}


当访问http://locahost:8080/项目名/hello/mvc时,就会进入test()方法处理,然后被请求重定向到login()方法中处理,最后返回名为view1页面.




Controller的方法可以直接return "add"即返回名为add的视图,或请求重定向、请求转发到其他Controller方法中处理.  [ 收起全文 ]

//专门用于解析用于上载的文件
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="209715200"></property>
  <property name="defaultEncoding" value="UTF-8"></property>
  <property name="resolvLazily" value="true"></property>
</bean>
//配置后可以使用spirng暴露的接口MultipartFile来获得文件


@RequestMapping(value="/fileUpload",method=RequestMethod.POST)
public String fileReceive(@RequestParam("file") MultipartFile file){
  
  return "success";
}

使用Spring MVC进行文件的上传:


1.导入commons-fileupload.jar、commons-io.jar


2.在DispatcherServlet配置文件中配置一个CommonsMultipartResolver类,并为其属性进行赋值.


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">


<!--设置文件上传大小限制-->
<property name="maxUploadSize" value="209715200" />


<!--默认字符集-->
<property name="defaultEncoding" value="UTF-8"/>


<!--是否使用懒加载模式-->
<property name="resolveLazily" value="true"/>


</bean>


3.前台页面form表单提交到Controller下的某个方法,enctype属性要设置为multipart/form-data(文件上传时必须显式写明).表单下存在type为file的input标签与提交按钮.


<form action="/courses/doUpload" enctype="multipart/form-data" method="post">


<input type="file" name="file"/>


<input type="submit" value="提交"/>


</form>

4.Controller的方法中需要接受一个Spring MVC提供的MultipartFile接口作为方法的参数.该参数接收前台表单type为file提交的对象.使用@RequestParam注解指明参数,那么Spring就会自动将表单传递过来的对象的类型转换为MultipartFile类型.


MultipartFile中提供了getName()、getSize()、getByte()
getContentType()、isEmpty()、getInputStream()、getOriginalFilename()方法来访问文件.
getOriginalFilename()方法是获取最初文件名,即本地文件名.




5.在Controller方法中使用FileUtils下的copyInputStreamToFile(InputStream in,File file)方法来完成文件的拷贝.第一个参数是文件拷贝源的输入流,直接使用MultipartFile下的getInputStream()方法.第二个参数是文件将要保存的位置.




@RequestMapping("/doUpload")
public String doUpload(@RequestParam("file") MultipartFile file){

if(!file.isEmpty()){


FileUtils.copyInputStreamToFile(file.getInputStream(),new File("E://",file.getOriginalFilename()));


}


return "success"


}

springmvc上传文件
①注册使用到的类:CommonsMultipartReslover类,这个类需要在spring的配置文件中进行配置,并设置一些必要的属性,比如是否延迟加载,上传文件的大小等等。
②注意form表单中,对应的表单的name值应该和controller中参数Multipart file的名称一致,另外注意表单提交方式为post,MIME编码为multipart/form-data
③在controller中通过传入的参数类型为Multipart file并且使用@Requestparam注解,完成参数的绑定,这样表单中的file就被复制到参数对象中。然后通过Multipart的一些方法,获取文件的名字信息并得到文件流对象,然后使用FileUtils类的copyInputStreamToFile(文件流,文件)完成文件的上传。

Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.
json的优点也使得Restful的webservice使用越来越广泛,逐渐由取代soap的趋势。

庄学爸   JSON:轻量级的数据交换格式


当我们访问Web应用程序的时候,会得到Web应用返回的model数据的呈现,以html格式返回,通过浏览器就能呈现出人可以理解的格式.


另一方面,很多公司提供了app应用用于对Web应用程序进行数据分析等,也是需要得到Web应用返回的model数据.此时Web应用程序可以把model数据以json的格式返回给app应用用于分析.



在这个过程当中,数据模型本身是没有变化,变化的只是呈现方式

Spring MVC中使用ContentNegotiatingViewResolver类来处理对相同数据不同呈现方式的应用场景.


如果是人类用户,需要得到html数据的呈现,则把请求代理给JSPView处理.


如果是机器,需要一份JSON数据的呈现,则把请求代理给JSONView

spring mvc使用json:
将模型数据转化成json
<property name="defaultViews">
<list>
<!--JSON View-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
</list>
</property>


添加json依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</>
</>


@RequestMapping()
public @ResponseBody User getUser() { //返回User的json串
}


也可以
public ResponseEntity<User> getUser() {}//返回User的json

Ajax与Spring MVC


前台用Ajax向Spring MVC发送一个异步请求,在Controller的方法下使用返回JSON格式的方法,返回以JSON格式的模型对象,前台页面中可直接获取到返回的模型对象信息.


不需要像Struts2,传递到Action之后获取PrintWriter对象向前台输出数据,然后action中的方法return null;


@Controller
@RequestMapping("/hello")
public class controller{


@RequestMapping(/testJson)
public @ResponseBody User getUserByJson(@RequestParam(userid) int userid){


return service.getUser(userid);
}


}

在前端使用ajax异步处理,触发请求,在请求的url中传入id,到后台之后,后台根据url,分解出pathVariable ,调用service方法,获得数据对象,然后返回@ResponseBody,此时,前台的ajax正在监听服务端的状态,如果是成功状态,将触发回调函数,函数中封装了对数据的逻辑,也就是使用js技术把数据对号入座,并且美化,展示页面。
请求路径是一种restful风格。
@RequestMapping(“/xxx/{xxId}”)
@PathVariable--Integer--xxId

course_json.jsp不能放在WEB-INF下,WEB-INF是私有的,一定要放在公共领域,直接访问course_json.jsp并传入参数即可(地址:localhost:8080/course_json.jsp?courseId=123)
页面加载完成后通过ajax异步的访问服务端,拿回数据后,通过JQuery动态加载DOM方式将数据呈现到页面上


@spingMVC通过使用ContentNegotiatingViewResover将相同格式的数据分发到不同的view请求中
@ResponseEntity将通过返回的数据转换为json
@ResponseBody标签处理返回的数据
@RequestBoby获取页面提交的json格式的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值