2.HelloWorld
(1)步骤:
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置DispatcherServlet初始化参数:配置springmvc配置文件的位置和名称 -->
<!--
实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
这样配置文件就不是放在src下了,而是放在WEB-INF下,此时名字叫做helloworld-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(4)创建Spring MVC配置文件
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.starfish.springmvc"></context:component-scan>
<!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
(5)创建请求处理器类
@Controller
public class HelloWorld {
/**
* 1. 使用 @RequestMapping 注解来映射请求的 URL(这里的请求就是:href="helloWorld")
* 2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver 视图解析器, 会做如下的解析:
* 通过 prefix + returnVal + 后缀 这样的方式得到实际的物理视图, 然会做转发操作
*
* /WEB-INF/views/success.jsp
*/
@RequestMapping("/helloWorld")
public String helloWorld(){
System.out.println("springMVC HelloWorld!");
return "success";
}
}
• Spring MVC 使用@RequestMapping注解为控制器指定可以处理哪些URL 请求
• 在控制器的类定义及方法定义处都可标注@RequestMapping
– 类定义处:提供初步的请求映射信息。相对于WEB 应用的根目录
– 方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注@RequestMapping,则方法处标记的URL 相对于WEB 应用的根目录
• DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法。
• @RequestMapping除了可以使用请求URL映射请求外,还可以使用请求方法、请求参数及请求头映射请求
• @RequestMapping的value、method、params及heads 分别表示请求URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。
• params和headers支持简单的表达式:
– param1: 表示请求必须包含名为param1 的请求参数
– !param1: 表示请求不能包含名为param1 的请求参数
– param1 != value1: 表示请求包含名为param1 的请求参数,但其值不能为value1
– {“param1=value1”, “param2”}: 请求必须包含名为param1 和param2 的两个请求参数,且param1 参数的值必须为value1
@Controller
@RequestMapping("springmvc")
public class SpringMVCTest {
private static final String SUCCESS = "success";
//了解:不常用, 可以使用params和header来更加精确的映射请求,他两支持简单的表达式
@RequestMapping(value="testParamsAndHeader",params={"username","age!=24"},headers={"Accept-Language=zh-CN,zh;q=0.8"})
public String testParamsAndHeader(){
System.out.println("testParamsAndHeader...");
return SUCCESS;
}}
4. 映射请求参数&请求参数
(1)
请求处理方法签名
————————————————jsp————————————————————————————————————
<a href="springmvc/testRequestParam?userName=starfish&age=22">Test RequestParam</a>
————————————————action——————————————————————————————————
@Controller
@RequestMapping("springmvc")
public class SpringMVCTest {
private static final String SUCCESS = "success";
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value="userName") String userName,
@RequestParam(value="age",required=false,defaultValue="18") int age){
System.out.println("testRequestParam--> userName :"+ userName + ", age:"+ age);
return SUCCESS;
}
(2)使用@RequestParam绑定请求参数值
@Controller
@RequestMapping("springmvc")
public class SpringMVCTest {
private static final String SUCCESS = "success";
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value="userName") String userName,
@RequestParam(value="age",required=false,defaultValue="18") int age){ //integer age可以不用写默认值
System.out.println("testRequestParam--> userName :"+ userName + ", age:"+ age);
return SUCCESS;
}
——————————————————
jsp:
<a href="springmvc/testRequestParam?userName=starfish&age=22">Test RequestParam</a>
5.处理模型数据
(1)Spring MVC 提供了以下几种途径输出模型数据:
– ModelAndView: 处理方法返回值类型为ModelAndView时, 方法体即可通过该对象添加模型数据
– Map 及Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map 中的数据会自动添加到模型中。
– @SessionAttributes: 将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
– @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
• 控制器处理方法的返回值如果为ModelAndView, 则其既包含视图信息,也包含模型数据信息。
• 添加模型数据:
– MoelAndView addObject(String attributeName, Object attributeValue)
– ModelAndView addAllObject(Map<String, ?> modelMap)
• 设置视图:
– void setView(View view)
– void setViewName(String viewName)j
————————————action————————————————
/**
* 目标方法的返回值可以是 ModelAndView 类型。
* 其中可以包含视图和模型信息
* SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中.
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);
//添加模型数据到 ModelAndView 中.
modelAndView.addObject("time", new Date());
return modelAndView;
}
——————————jsp——————————————————
<a href="springmvc/testModelAndView">Test ModelAndView</a>
success page: time: ${requestScope.time }
(3)Map及Model
————————————action————————————————
/**
* 目标方法可以添加 Map 类型(实际上也可以是 Model 类型或 ModelMap 类型)的参数.
* @param map
* @return
*/
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
System.out.println(map.getClass().getName());
map.put("names", Arrays.asList("Tom", "Jerry", "Mike"));
return SUCCESS;
}
——————————jsp——————————————————
<a href="springmvc/testMap">Test testMap
</a> success page:
names: ${requestScope.name }