学习spring

一、spring框架

1、XML配置文件

如果需要更强的spring配置能力,可以在schema location属性中添加相应的schema。配置文件可以是一份,也可以分解为多份,以支持模块化配置。ApplicationContext的实现类支持读取多份配置文件。另一种选择是,通过一份主配置文件,将该文件导入到其他配置文件。

2、spring控制反转容器的使用

(1)通过提供一个控制反转容器(或依赖注入容器),spring提供了一种管理Java对象依赖关系的方法,程序员无需了解spring框架的存在,更不需要引入任何spring类型。

(2)从1.0版本开始,spring就同时支持setter和构造器方式的依赖注入。从2.5版本开始,通过Autowired注解,spring支持基于field方式的依赖注入,缺点是程序无法直接迁移至另一个依赖注入容器间。

(3)使用spring,程序几乎将所有重要对象的创建工作移交给spring,并配置如何注入依赖。spring支持XML或注解两种配置方式。此外,还需创建一个ApplicationContext对象,代表一个spring控制反转容器。

(4)对于spring mvc应用,可以通过一个spring servlet来处理ApplicationContext,而无需直接处理。

(5)通过构造器创建一个bean实例

应采用id或name属性标识一个bean。为了让spring创建一个Product实例,应将bean定义的name值“product”(也就是id值)和Product类型作为参数传递给ApplicationContext的getBean()。

(6)通过工厂方法创建一个bean实例(spring支持通过调用一个工厂方法来实例化类)

通过工厂方法来实例化java.util.Calendar:
<bean id="calendar" class="java.util.Calendar" factory-method="getInstance" />

采用getBean()获取Calendar实例:
ApplicationContext context=new ClassPathXmlApplicationContext(new String[] {"spring-config.xml"});
Calendar calendar=context.getBean("Calendar",Calendar.class);


(7)Destroy Method的使用

可以在bean 定义中配置destroy-method属性,来指定在销毁前要被执行的方法。

配置spring通过java.util.concurrent.Executes的静态方法newCachedThreadPool来创建一个ava.util.concurrent.ExecutorService实例,并指定destroy-method属性值为shutdown方法。这样,spring会在销毁Executor实例前调用其shutdown方法。
<bean id="executorService" class="java.util.concurrent.Executors" factory-method="new CachedThreadPool" destroy-method="shutdown" />

(8)向构造器传递参数(spring支持通过带参数的构造器来初始化类)

通过参数名传递参数;

通过指数方式传递参数,对应构造器的所有参数必须传递,缺一不可。

(9)setter方式依赖注入

通过配置property元素来调用setter方法以设置值。

被引用对象的配置定义无需早于引用其对象的定义。

二、模型2和MVC模式

JavaWeb应用开发中有两种设计模式,分别称为模型1和模型2.模型1是页面中心,适用于小应用开发。模型2基于MVC模式,是JavaWeb应用的推荐架构(简单类型的应用除外)。

1、模型2介绍

(1)模型2基于模型-视图-控制器(MVC模式),该模式是Smalltalk-80用户交互的核心概念。

(2)一个实现MVC模式的应用包含模型、视图和控制器3个模块。视图负责应用的展示。模型封装了应用数据和业务逻辑。控制器负责接收用户输入、改变模型以及调整视图的显示。

(3)模型2中,servlet或filter都可以充当控制器。大部分都采用JSP页面作为应用的视图,模型则采用POJO,POJO是一个普通对象。


每个HTTP请求都发送给控制器,请求中的URI标识出对应的action。action代表了应用可以执行的一个操作。一个提供了

Action的Java对象称为action对象。一个action类可以支持多个action。

控制器会解析URI并调用相应的action,然后将模型对象放到视图可以访问的区域。最后控制器会利用RequestDispatcher跳转到视图(JSP页面)。在JSP页面中,用表达式语言以及定制标签显示数据。

调用RequestDispatcher.forward方法并不会停止执行剩余的代码,因此,若forward方法不是最后一行代码,则应显示的返回。

2、模型2之servlet控制器

(1)Product类

Product实例是一个封装了产品信息的JavaBean。Product类包含了三个属性:productName、description和price。Product

类实现了java.io.Serializable接口,其实例可以安全的将数据保存到HttpSession中。

(2)ProductForm类

表单类与HTML表单相映射,是后者在服务端的代表。ProductForm类包含了一个产品的字符串值。表单对象会传递ServletRequest给其他组件,而ServletRequest是一个servlet层的对象,不应当暴露给应用的其他层。当数据校验失败时,表单对象将用于保存和展示用户在原始表单上的输入。大部分情况下,一个表单类不需要实现Serializable接口,因为表单对象很少保存在HttpSession中。

(3)ControllerServlet类

ControllerServlet类继承自javax.servlet.http.HttpServlet类。其中doGet和doPost方法最终调用process方法,其方法是整个servlet控制器的核心。

(4)视图

可以通过如下几种方式避免用户通过浏览器直接访问JSP页面:

将JSP页面都放在WEB-INF目录下;

利用servlet filter过滤JSP页面;

在部署描述符中为JSP增加安全限制;

3、校验器

(1)现在的MVC框架通常同时支持编程式和申明式两种校验方法。在编程式中,需要通过编码进行用户输入校验,而在申明式中,则需要提供包含校验规则的XML文档或属性文件。

(2)应用中唯一需要用到产品校验的地方是保存产品时,即SavaProductController类。

4、后端

应用MVC,可以在Controller类中调用后端业务逻辑。通常,需要若干封装了后端复杂逻辑的Service类。在Service类中,可以实例化一个DAO类来访问数据库。在spring环境中,Service对象可以自动被注入到Controller实例中,而DAO对象可以自动被注入到Service对象中。

三、spring mvc介绍

1、采用spring mvc的好处

(1)若是基于某个框架开发一个模型2的应用程序,我们要负责编写一个Dispatcher Servlet和控制类。

(2)spring mvc是一个包含了Dispatcher Servlet的mvc框架,它调用控制器方法并转发到视图。

2、spring mvc的Dispatcher Servlet

(1)spring mvc中自带了一个开箱即用的Dispatcher Servlet,要使用这个Servlet,需要把它配置在web.xml,应用servlet和servlet-mapping。

        <servlet>
	<servlet-name>spring mvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>     //可选,如果它存在,则它将在应用程序启动时装载servlet并调用它的init方法;如果它不存在,则在该servlet的第一个请求时加载。
	</servlet>

	<servlet-mapping>
	<servlet-name>spring mvc</servlet-name>
	<url-pattern>/</url-pattern>
	</servlet-mapping>
(2)Dispatcher Servlet将使用spring mvc诸多默认的组件。此外,初始化时,它会寻找一个在应用程序的WEB-INF目录下的配置文件,该配置文件的命名规则如下:servletName-servlet.xml,其中servletName是在部署描述符中的Dispatcher Servlet名称。

(3)可以把spring mvc的配置文件放在应用程序目录中的任何地方,用servlet定义的init-param元素,以便Dispatcher Servlet加载到该文件。init-param元素拥有一个值为contextConfigLocation的param-name元素,其param-value元素则包含配置文件的路径。

3、Controller接口

Controller接口 的实现类只能处理一个单一动作,而一个基于注解的控制器可以同时支持多个请求处理动作,并且无需实现任何接口。开发一个控制器的唯一方法是实现org.springframework.web.servlet.mvc.Controller接口,这个接口公开了一个handleRequest方法。其实现类可以访问对应请求的HttpServletRequest和HttpServletResponse,还必须返回一个包含视图路径或视图路径和模的ModelAndView对象。

4、View Resolver

(1)spring mvc中的视图解析器负责解析视图,可以通过在配置文件中定义一个View Resolver来配置视图解析器。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>     //前缀
<property name="suffix" value=".jsp"></property>     //后缀
</bean>

四、基于注解的控制器

1、spring mvc注解类型

使用基于注解的控制器的几个优点:其一,一个控制器类可以处理多个动作(一个实现了Controller接口的控制器只能处理一个动作),这就允许将相关的操作写在同一个控制器类,从而减少应用程序中类的数量。其二,基于注解的控制器的请求映射不需要存储在配置文件中。使用ReuqestMapping注释类型,可以对一个方法进行请求处理。

(1)Controller注解类型

spring使用扫描机制来找到应用程序中所有基于溶解的控制器类,为了保证spring能找到控制器,首先需要在spring mvc的配置文件中声明spring-context,如下所示:

<beans ...... xmlns:context="http://www.springframework.org/schema/context">
然后,需要应用<component-scan />元素,如下所示:

<context:component-scan base-package="basePackage" />     //在<component-scan />元素中指定控制器类的基本包
(2)RequestMapping注解类型

RequestMapping注释类型的作用:映射一个请求和一种方法。可以使用@RequestMapping注释一种方法或类。一个采用@RequestMapping注释的方法将成为一个请求处理方法,并由调度程序在接收到对应URL请求时调用。

@Controller
public class CustomerController{
@RequestMapping(value="/customer_input")     //将URI映射到方法
public String inputCustomer(){
return "CustomerForm";
   }
}

由于value属性是RequestMapping注释的默认属性,因此,若只有唯一的属性,则可以忽略属性名称。但如果有超过一个属性时,就必须写入value属性名称。请求映射的值可以是一个空字符串。

RequestMapping的method属性用来只是该方法仅处理哪些HTTP方法。

@RequestMapping(value="/order_process",method={RequestMapping.POST,RequestMapping.PUT})

若method属性只有一个HTTP方法值,则无需花括号,如果没有指定method属性值,则请求处理方法可以处理任意HTTP方法。

2、编写请求处理方法

每个请求处理方法可以有多个不同类型的参数,一个一个多种类型的返回结果。

3、应用@Autowired和@Service进行依赖注入

(1)spring框架一开始就是一个依赖注入容器。将依赖注入到spring mvc控制器的最简单方法是通过注解@Autowired到字段或方法。

(2)为了能被作为依赖注入,类必须注明为@Service。@Service注释类型指示类是一个服务。此外,在配置文件中,还需要添加一个<component-scan />元素来扫描依赖基本包。

4、重定向而后Flash属性

(1)转发比重定向快,因为重定向经过客户端,而转发没有。若需要重定向到一个外部网站,则无法使用转发。为了避免用户在重新加载页面时再次调用同样的动作须使用重定向。使用重定向无法轻松的传值给目标页面。而采用转发,则可以简单的将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都在重定向时丢失。

(2)Flash属性提供了一种供重定向传值的方法,要使用Flash属性,必须在spring mvc配置文件中有一个<annotation-driven />元素,还必须在方法上添加一个新的参数类型。

5、请求参数和路径变量

(1)请求参数和路径变量都可以用于发送值给服务器,二者都是URL的一部分,请求参数采用key=value形式,并用“&”分隔。spring mvc通过使用org.springframework.web.bind.annotation.RequestParam注释类型来注释方法参数。

获取请求参数productId值的参数:
public void sendProduct(@RequestParam int productId)

(2)路径变量只是一个值,用来发送一个值到服务器。使用路径变量,需要在RequestMapping注解的值属性中添加一个变量,该变量必须放在花括号之间,然后在方法签名中添加一个同名变量,并加上@PathVariable注解。当该方法被调用时,请求URL的id值将被复制到路径变量中,并可以在方法中使用。路径变量的类型可以不是字符串。spring mvc将尽力转换为非字符串类型。可以在请求映射中使用多个路径变量。

定义一个名为id的路径变量:
@ReuqestMapping(value="/product_view/{id}")

(3)任何静态文件路径的解析,将使用http://example.com/context作为基本路径。

(4)可通过使用JSTL标记的URL标签通过正确解析来修复浏览器误解路径变量。

6、@ModelAttribtue

(1)spring mvc在每次调用请求处理方法时,都会创建Model类型的一个实例,若打算使用该实例,则可以在方法中添加一个Model类型的参数。还可使用在方法中添加ModelAttribute注释类型来访问Model实例。

(2)可以用@ModelAttribute来注释方法参数或方法,带@ModelAttribute注解的方法会将其输入的或创建的参数对象添加到Model对象中。

(3)可使用@ModelAttribute标注一个非请求的处理方法。被@ModelAttribute注释的方法会在每次调用该控制器类的请求处理方法时被调用。如果一个控制器类有两个请求处理方法,以及一个有@ModelAttribute注解的方法,该方法的调用次数就会比每个处理请求方法频繁。

(4)spring mvc会在调用请求处理方法之前调用带@ModelAttribute注解的方法。带@ModelAttribute注解的方法可以返回一个对象或一个void类型。如果返回一个对象,则返回对象会自动添加到Model中。

@ModelAttribute
public Prooduct addProduct(@RequestParam String productId){
return productService.get(productId);
}

若方法返回void,则还必须添加一个Model类型的参数,并自行将实例添加到Model中。

@ModelAttribute
public void populateModel(@RequestParam String id,Model model){
model.addAttribute(new Account(id));
}

五、转换器和格式化

1、Converter

spring的Converter可以将一种类型转换为另一种类型的一个对象。为了创建Converter,必须编写一个实现org.springframework.core.convert.converter.Converter接口的Java类。这个接口的声明如下:

public interface Converter<S,T>

创建一个可以将Long转换为Date的Converter:
public class MyConverter implements Converter<Long,Date>{ }

在类body中,需要编写一个来自Converter接口的convert方法实现,这个方法的签名如下:

T convert (S source)

为了使用spring mvc应用程序中定制的Converter,需要在spring mvc配置文件中编写一个conversionService bean。这个bean必须包含一个converters属性,它将列出要在应用程序中使用的所有定制Converter。

2、Formatter

Formatter也是将一种类型转换为另一种类型,。Formatter的源类型必须是以一个String,Formatter更适合Web层, Converter可以用在任意层中。为了转换spring mvc应用程序表单中的用户输入,始终应该选择Formatter。为了创建Formatter,要编写一个实现org.springframework.format.Formatter接口的Java类,这个接口的声明如下:

public interface Formatter<T>

该接口有parse和print两个方法,所有实现都必须覆盖。

T parse (String text,java.util.Locale locale)
String print (T object,java.util.Locale locale)

parse方法利用指定的Locale将一个String解析成目标类型,print方法返回目标对象的字符串表示法。

为了在spring mvc应用程序中使用Formatter,需要利用conversionService bean对它进行注册。

六、验证器

1、验证概览

(1)Converter和Formatter作用于field级。验证器作用于object级,它决定某一个对象中的所有field是否均是有效的,以及是否遵循某些原则。

(2)如果一个应用程序中既使用了Formatter,又有validator(验证器),那么它们的时间顺序:在调用Controller期间,将会有一个或多个Formatter,试图将输入字符串转换成domain对象中的field值。一旦格式化成功,验证器就会介入。

2、验证器

(1)为了创建spring验证器,要实现org.springframework.validation.Validator接口,其中有supports和validate两个方法:

public interface Validator{
boolean supports (Class<?>clazz);
void validator(Object target,Errors errors);
}

如果验证器可以处理指定的Class,supports方法将返回true。validate方法会验证目标对象,并将验证错误填入Errors对象。

(2)Errors对象中包含了一系列FieldError和ObjectError对象。FieldError表示与被验证对象中的某个属性相关的一个错误。

(3)编写验证器时,不需要直接创建Error对象, 因此实例化FieldError或ObjectError花费了大量的编程精力,这是由于ObjectError类的构造器需要4个参数,Field类的构造器则需要7个参数。
(4)Errors对象中的错误信息,可以利用表单标签库的Errors标签显示在HTML页面中。错误消息可以通过spring支持的国际化特性本地化。

3、ValidationUtils类

org.springframework.validation.Validation类是一个工具,有助于编写spring验证器。

4、源文件

验证器不需要显示注册,但是想要从某个属性文件中获取错误信息,则需要通过声明messageSource bean,告诉spring要去哪里查找这个文件。

5、Controller类

(1)在Controller类中通过实例化validator类,可以使用spring验证器。

(2)使用spring验证器的另一种方法是:在Controller中编写initBinder方法,并将验证器传到WebDataBinder,并调用其validate方法。将验证器传到WebDataBinder,会使该验证器应用于Controller中所有处理请求的方法。或者利用@javax.validation.Valid对要验证的对象参数进行标注。Vaild标注类型实在JSR 303中定义的。

6、JSR 303验证

(1)JSR 303不需要编写验证器,但要利用JSR 303标注类型嵌入约束。

(2)可以在属性文件中以下列格式使用property键,来覆盖来自JSR 303验证器的错误信息:constraint.object.property。







































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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值