学习spring mvc 一

来源:互联网 发布:网络磕是什么意思 编辑:程序博客网 时间:2024/05/15 02:17

在人生的消费当中,要多做生产性、建设性消费,这样才能达到会花钱的人才会赚钱的的这种状态。很多事情的发生都来自于想要,如果不想要则什么事都可以不做。既然想要学习spring mvc那就要做生产性、建设性消费。一般人买个新产品就是发个朋友圈炫耀一下就把新产品丢到一边过去了,这是普通消费;而生产性、建设性消费就是买了新产品后,就开始写产品用户体验,写产品的优点在哪里,独特点在哪里,缺点在哪里,就能发掘产品的性能,也能发朋友圈让大家明白,共同探讨,让自己获得知识和体验。学习spring mvc要做生产性、建设性消费,就是花时间去学习了,就要写博客记录自己学习到的知识,也能分享给大家,和一起学习的人一起探讨共同进步。自己在多年学习之后也能够反过头来看自己的博客,能够重温下知识。这和看完电影写影评的道理是相通的。

今天开始第一天的spring mvc框架学习。

----------------------3小时完成-----------------------------------

要做的事:学习spring mvc DispatcherServlet

1、学习spring mvc DispatcherServlet是什么东西

2、学会配置spring mvc DispatcherServlet

3、使用各种注解写controller控制器

-------------------------------------------------------------------------

spring mvc框架全称是spring  web model-view-controller框架,是围绕DispatcherServlet设计的,并分发请求到处理程序(handler),spring mvc 支持可配置的处理程序映射(handler mapping),视图解析(view resolution)、区域设置(locale)和主体解析(theme resolution),以及文件上传等特性。默认handler基于@Controller和@RequestMapping注解,提供范围广泛且灵活的处理方法。并且spring3.0支持REST,REST即表述性状态传递原则,通过@PathVariable注解和其他特性来支持REST。

在spring web mvc中,可以使用任何对象作为命令对象或表单对象;不需要实现框架特定接口或基类。spring的数据绑定是高度灵活的。例如,它把类型不匹配当作验证错误,这样就可以算作应用程序错误,而不是系统错误。因此不需要简单的重复拷贝业务对象的属性,表单对象中的非类型化的字符串知识处理无效的提交,或者合理的转换字符串。

DispatcherServlet概念

Spring mvc框架就像其他mvc框架一样,采用请求驱动,围绕一个核心Servlet设计,就是DispatcherServlet,由DispatcherServlet将请求分发到控制器并提供其他功能,使web应用开发更简便。

DispatcherServlet是“前端控制器”设计模式(这是一种spring mvc和其他领先的web框架共享的模式)的一种实现。

DispatcherServlet实际上是一个Servlet(继承自HttpServlet基类),因此它也是在应用程序中web.xml文件中配置的。通过web.xml中配置URL映射,将需要处理的请求交给DispatcherServlet处理。这是标准的java EE Servlet配置。下面的示例展示了DispatcherServlet的声明和映射:

<web-app>

<servlet>

<servlet-name>example</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>


<servlet-mapping>

<servlet-name>example</servlet-name>

<url-pattern>/example/*</url-pattern>

</servlet-mapping>

</web-app>

上面的例子中。所有的以/example开始的请求都会由配置的名为example的DispatcherServlet实例处理.

--重点--:

***在DispatcherServlet初始化时,Spring mvc将在WEB-INF目录中搜索名为[servlet-name]-servlet的xml文件,并创建该文件中配置的bean。优先于任何使用相同的名称在全局范围内定义的bean的定义。***

--重点结束--


请考虑下面的DispatcherServlet 配置(在web.xml文件中):

<web-app>

<servlet>

<servlet-name>golfingabc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>


<servlet-mapping>

<servlet-name>golfingabc</servlet-name>

<url-pattern>/golfing/*</url-pattern>

</servlet-mapping>

</web-app>

与上面的Servlet配置相对应的,在你的应用程序中,你将需要有一个名为/WEB-INF/golfingabc-servlet.xml的文件。这个文件将包含所有spring mvc特定的组件(bean)。

DispatcherServlet处理顺序

你设置了DispatcherServlet之后,并有请求传入到该特定的DispatcherServlet后,DispatcherServlet将启动对请求的处理,如下所示:

1 WebApplicationContext被搜索,作为一个属性绑定到请求中,处理过程中的控制器和其他元素都可以使用。

2 Local解析被绑定到请求中,以便处理请求时,可以启用进程中的元素来决定使用何种locale.

3 主题解析绑定到请求中以便例如View之类的元素确定要使用的主键。

4 如果你指定了multipart文件解析,该请求被视为multipart;如果发现有multipart,请求将被包装在MultipartHttpServletRequest中,由处理过程中的其他元素作进一步处理。

5 搜索一个适当的处理程序(handler)。

6 如果返回了一个模型,则在呈现视图。如果不返回任何模型,没有视图呈现。


你可以通过给web.xml中的servlet添加servlet的初始化参数(init param元素)来自定义各个DispatcherServlet实例。

参数 说明

contextClass 实现WebApplicatioinContext的类,实例化此Servlet使用的上下文,不定义默认使用XmlWebApplicationContext

contextConfigLocation  传递给上下文实例的字符串。

namespace WebApplicationContext的命名空间。默认使用[servlet-name]-servlet。


Spring2.5引入mvc controller基于注解的编程模型,使用@RequestMapping、@RequestParam、@ModelAttribute等注解。

下面来看一个例子

@Controller

public class HelloWorldController{

@RequestMapping("/helloWorld")

public String helloWorld(Model model){

model.addAttribute("message","Hello World!");

return "helloWorld";

}

}


在上面这个例子中我们可以看到@Controller和@RequestMapping注解允许灵活使用方法名和签名。@Controller和@RequestMapping 和一些其他注解形成了Spring mvc实现的基础。

使用@Controller注解定义控制器:

@Controller注解指明改特定类以控制器的角色提供服务。

@Controller注解作为注解了的类的版式,指明它的角色。

--重点--

通过@Controller注解的类会被dispatcher(调度程序)扫描注册并使用该类的映射了的方法同时检测@RequestMapping注解


使用@RequestMapping 映射请求

下面是一个例子,使用@RequestMapping 注解将/appointments这种url映射到整个类或特定的handler方法。通常类级别注解将特定的请求路径映射到特定的form Controller,方法级别的注解将缩小特定HTTP方法的请求方法("GET","POST"等)或HTTP请求参数条件的主映射。

注意:get是前台从服务器上获取数据,post是前台向服务器传送数据。

建议:

添加、修改、删除用Post方式

查询 用Get方式.

post:邮寄

RequestMapping 示例:

@Controller

@RequestMapping("/appointments")

public class AppointmentController{

private final AppointmentBook appointmentBook;


@Autowired

public AppointmentsController(AppointmentBook appointmentBook){

this.appointmentBook = appointmentBook;

}

@RequestMapping(method = RequestMethod.GET)

public Map<String,Appointment> get(){

return appointmentBook.getAppointmentsForToday();

}

@RequestMapping( value="/{day}", method = RequestMethod.GET)

public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso-ISO.DATE) Date day,Model model){

return appointmentBook.getAppointmentsForDay(day);

}

@RequestMapping(value="/new", method = RequestMethod.GET)

public AppointmentForm getNewForm(){

return new AppointmentForm();

}

@RequestMapping(method = RequestMethod.POST)

public String add(@valid AppointmentForm appointment, BindingResult result) {

if(result.hasErrors()) {

return "appointments/new";

}

appointmentBook.addAppointment(appointment);

return "redirect:/appointments";

}

}

说明:

这个例子中,几处用到了@RequestMapping

1、第一次是做为类级别的注解使用,这表明此控制器上的所有处理方法,是相对于/appointments路径的。

2、第二次是Get()方法有已进一步细化的@RequestMapping:它只接受GET请求,也就是说/appointments为HTTP GET的请求才调用此方法。

3、第三次getForDay()方法是展示了@RequestMapping的另外一个用法:URI模板。

4、第四次getNewForm()方法将指定HTTP方法和请求路径信息绑定起来,因此/appointments/new请求将由该方法处理。

5、第五次add()方法是有已进一步细化的@RequestMapping:它只接受POST请求,也就是说/appointments为HTTP POST的请求才调用此方法。


接下来讲下上例第3次@RequestMapping的URI模板用法:

URI模板模式

URI模板可以用于便利地访问@RequestMapping方法中的URL选择的部分。

URI模板是一个类似URI的字符串,包含一个或多个变量的名称。当你替换这些变量的值时,该模板将成为URI。URI模板定义了URI是如何参数化的。

例如,URI模板

http://www.example.com/users/{userld} 包含变量名userid。将变量值替换为fred,生成的URI如下

http://www.example.com/users/fred。

在Spring mvc中你可以在方法参数上使用@PathVariable注解,以将其值绑定到URI模板变量。

@RequestMapping(value="/owners/{ownerid}",method=RequestMethod.GET)

public String findOwner(@PathVariable String ownerid ,Model model){

Owner owner = ownerService.findOwner(ownerid);

model.addAttribute("owner",owner);

return "displayowner";

}

该URI模板"/owners/{ownerid}"指定变量名ownerid。当控制器处理此请求时,ownerid的值设置为URI相应部分中找到的值。例如,当一个请求到来为/owners/fred,ownerid的值时fred。

这种方法是采用了默认方法参数名与请求参数名相同的简单写法。下面是完整写法,可以自定义方法参数名:

@RequestMapping(value="/owners/{ownerid}",method=RequestMethod.GET)

public String findOwner(@PathVariable("ownerid") String theowner,Model model){

//implementation omitted

}

一般是采用默认的写法,比较方便。


一个方法函多个@PathVariable注解:

@RequestMapping(value="/owners/{ownerid}/pets/{petid}",method=RequestMethod.GET)


public String findPet(@PathVariable String ownerid, @PathVariable String petid, Model model){

Owner owner = ownerService.findOwner(ownerid);

Pet pet = owner.getPet(petid);

model.addAttribute("pet",pet);

return "displaypet";

}



以上就是今天的学习内容。













0 0
原创粉丝点击