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

SpringMVC学习记录

2014-12-26 00:00 495 查看
摘要: 初学SpringMVC的笔记

1、浏览器发出请求,如url:localhost:8080/test/start.test

2、请求会给到DispatcherServlet(总的控制中心——前端控制器),由它对请求进行派发,前端控制器是需要写在配置文件web.xml中,即

<servlet>
<servlet-name> test</servlet-name >
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class >
<load-on-startup> 1</ load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name> test</servlet-name >
<url-pattern> *.test</url-pattern >
</servlet-mapping>

由于限制了url的格式,如果请求是已.test结尾的。

3、前端控制器DispatcherServlet接收到请求,派发给我们自己的控制器,即具体的控制器,如StartController,如何派发给自己的控制器呢,就需要一个HandlerMapping,即建立了请求与控制器之间的映射,HandlerMapping需要配置在test-Servlet.xml文件中。

这里说一个比较简单的控制器,SimpleUrlHandlerMapping,配置代码如下:

<!-- 基于Url的控制器,比较简单的控制器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
<property name="mappings" >
<props>
<prop key="start.test" >startController</ prop>
<prop key="add_emp.test" >addEmpController</ prop>
<!-- UrlFilenameViewController -->
<prop key="add.test" >addEmpSuccController</ prop>
</props>
</property>
</bean>

4、转到哪个具体的控制器,就需要按自己的要求去选择了。

上面提到的,自己建立的控制器,实现的是简单的Controller接口,如下:

<bean id= "startController" class ="test.StartController"></ bean>

常用的,以及好用的控制器,在一般项目中经常使用到的。

用于直接跳转页面的控制器:

ParameterizableViewController,UrlFilenameViewController

配置如下:

(1)需要指定视图名,name ="viewName" value= "login"。

<!-- 参数化的ViewController,我们不需要自己建立,只需要直接使用就可以了 -->
<bean id= "loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" >
<property name="viewName" value="login"/>
</ bean>

(2)不需要指定视图名,他是获取Url中的“.test”前面那一段。如“add_emp”

<!-- 使用UrlFilenameViewController,就不需要配置视图名这个过程。 -->
<bean id= "addEmpController"
class="org.springframework.web.servlet.mvc.UrlFilenameViewController" >
</bean>

使用时机:有时候,把所有的jsp文件隐藏在WEB-INF中里面。

进阶,控制器,包括

AbstractController

命令控制器——AbstractCommandController

(3)这个控制器开始,可以自动封装表单参数成Object commandc对象,控制器中只需要。

//自动封装表单参数成command,再强制装换成 Emp对象。

Emp emp=(Emp)command;

//service.addEmp(emp);

System. out.println(emp);

在配置文件中,需要制定Command是一个什么样类型的类。

<!-- 指定command对象是一个什么样的类,此处为员工类test.Emp -->
<bean id= "addEmpSuccController" class="test.EmpController">
<property name="commandClass" value="test.Emp"/>
</bean>

如此就可以了。

(4)说到这个控制器能够自动封装表单成为我们需要的Bean,表单中的类型为int或String类型,可以,如果是Date类型,就不可以。

整型正确转行,日期型不正确转化

属性编辑器的问题

如何提供自己的属性编辑器。

DataBind——数据绑定

给数据绑定对象注册一个日期类型的属性编辑器,需要重写初始化绑定期的方法

@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception {
// TODO Auto-generated method stub
super.initBinder(request, binder);
}

自定义为如下所示:

//注册了日期转换的编辑器
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(Date. class, new CustomDateEditor(
new SimpleDateFormat("yyyy-MM-dd" ), true));
}

表单控制器——SimpleFormController

(5)onSubmit方法,当表单用post方法提交时,会转到这个方法。如果进入一个页面之前有,有数据需要初始化,需要用到referenceData方法。建造一个map模型。

jsp页面需要使用到jstl包。

@Override
protected Map referenceData(HttpServletRequest request) throws Exception {
Map<String, Object> model= new HashMap<String, Object>();
model.put( "deptList", new String[]{"sales", "manage"});
return model;
}

/**
* onSubmit方法,是当表单提交时处理请求
* 3.0版本后少用。
* 如果使用command控制器,只要 Url符合要求,自动就会提交
* 如果使用Form控制器,只有表单是method="post"时,才会去执行onSubmit方法。
*/
@Override
protected ModelAndView onSubmit(Object command) throws Exception {

Emp emp = (Emp) command;
// service.addEmp(emp);
System. out.println(emp);
return new ModelAndView(getSuccessView() );

}

test-servlet.xml配置文件需要配置如下:

<bean id= "addEmpController" class ="test.EmpFormController">
<property name="commandClass" value="test.Emp" />
<property name="formView" value="add_emp" />
<property name="successView" value="success" />
</bean>

(6)

5、视图解析器。

<!--基于URL的视图解析器, 从逻辑视图名称到真正视图上面的映射 -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" >
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>


跳转到哪个页面,是根据这里设定的,



6、基于注解的MVC

加入包

当有多个配置文件时,可以在web.xml中配置如下:

<servlet >
<servlet-name >mvc</ servlet-name>
< servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<init-param >
<param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 -->
<param-value> /WEB-INF/classes/spring/*.xml </param-value>
</init-param >
<load-on-startup >1</ load-on-startup>
</servlet >


看样子是知道了,虽然是在src/config里面建立配置文件,但是项目运行会把它放到上面的路径中。

下面的配置是重点!

<init-param >
<param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 -->
<param-value> /WEB-INF/classes/spring/*.xml </param-value>
</init-param >


在Controller中,添加注解,如

@Controller
@RequestMapping("/test" )
public class TestController {

@RequestMapping("/start/{name}" )
public String start(@PathVariable String name){

System. out.println(name);
return "start" ;
}

}


上面使用了两个注解。看到了吧

在servlet.xml中,首先,需要扫描包含控制器的包,找到这些注解。

<!-- 1、进行普遍扫描 -->
<context:component-scan base-package="test.controller" />


<!-- 2、视图解析器,使用 jsp或者jstl 最适合使用这个类。基于Resources的解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>


详细讲 @RequestMapping ("/start" )

方法级别(一定要有),如上http://localhost:8080/@mvc/start.do

类级别,相当于根路径http://localhost:8080/@mvc/test/start.do

restfull,Url层面上的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring MVC