springMVC的执行原理是访问指定路径,然后前端控制器接收请求,转发到处理器映射器查找对应的处理器映射器,由处理器适配器执行handler,返回一个MoldelAndView对象到视图解析器,由视图解析器来解析,最后显示到浏览器
所以第一步先配置前端控制器
//在web.xml中配置前端控制器
<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- *.action结尾的url会由DispatcherServlet处理 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
然后配置处理器映射器和处理器适配器
//在springMVC配置文件中配置处理器映射器和处理器适配器
<!-- 非注解的处理器映射器 -->
<!-- 根据BeanName作为url来访问handler -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 非注解的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 创建handler对象 -->
<bean class="com.melon.controller.ItemsController" name="/queryItems.action"></bean>
//非注解映射器还有另一个简单url映射器,可以直接配置多个url地址
<!-- 简单url处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- key中填写访问路径,标签内填写handler的id -->
<prop key="/queryItems1.action">queryItems</prop>
</props>
</property>
</bean>
编写handler
//编写handler,需要实现Controller接口并实现handleRequest方法
public class ItemsController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<Items> itemLists = new ArrayList<>();
Items cellPhone = new Items();
cellPhone.setId(1);
cellPhone.setName("金立手机");
cellPhone.setPrice(2000.0);
cellPhone.setDetail("垃圾手机");
Items lapTop = new Items();
lapTop.setId(2);
lapTop.setName("惠普电脑");
lapTop.setPrice(5000.09);
lapTop.setDetail("还行");
//将静态数据加入到list中
itemLists.add(cellPhone);
itemLists.add(lapTop);
ModelAndView mnv = new ModelAndView();
//将list对象添加到值域中,相当于request.setAttribute(arg0, arg1)方法
mnv.addObject("itemLists", itemLists);
//设定返回页面路径
mnv.setViewName("/jsp/itemList.jsp");
//返回ModelAndView对象
return mnv;
}
}
再配置视图解析器
<!-- 视图解析器,解析jsp,默认使用jstl标签 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
在浏览器中访问localhost:8080/springmvc-day1/queryItems.action即可
配置注解的处理器映射器和处理器适配器
//注解的处理器映射器和处理器适配器
<!-- 注解的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 注解的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!-- 使用mvc:annotation-driven可以自动加载注解的处理器映射器和处理器适配器,还有其他组件,可以取代上面的配置 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 组件扫描,可以扫描指定包中的handler -->
<context:component-scan base-package="com.melon.controller"></context:component-scan>
编写注解的handler
//使用@Controller注解标识这个类是一个控制器
@Controller
public class ItemsController1 {
//使用@RequestMapping配置这个控制器的访问路径,使用注解开发可以在一个类中定义多个方法
@RequestMapping("/view")
public ModelAndView view() {
List<Items> itemLists = new ArrayList<>();
Items cellPhone = new Items();
cellPhone.setId(1);
cellPhone.setName("金立手机");
cellPhone.setPrice(2000.0);
cellPhone.setDetail("垃圾手机");
Items lapTop = new Items();
lapTop.setId(2);
lapTop.setName("惠普电脑");
lapTop.setPrice(5000.09);
lapTop.setDetail("还行");
itemLists.add(cellPhone);
itemLists.add(lapTop);
ModelAndView mnv = new ModelAndView();
mnv.addObject("itemLists", itemLists);
mnv.setViewName("/jsp/itemList.jsp");
return mnv;
}
}
以上就是一个简单的SpringMVC入门程序
编写Controller方法返回类型可以是ModelAndView、String、void,例如:
@RequestMapping("/searchUser")
public String searchUser(Model model) throws Exception {
User user = new User();
user.setId(2);
List<User> userList = userService.searchUser(user);
model.addAttribute("userList", userList);
return "userList";
}
这里的返回值类型是String,所以返回值是一个页面的路径,在形参中定义一个Model对象,即可用model里面的方法传递model
扩展
springmvc参数绑定
在表单提交的数据绑定到Controller的形参中
//@RequestParam(value="id")Integer itemId)这个注解中的value的值是表单中的name属性的值,会自动封装到itemId中
public ModelAndView register(@RequestParam(value="id")Integer itemId){}
//封装到实体类中,表单中的name属性的值要对应实体类里面的属性名称
public ModelAndView register(User user){}
解决POST乱码
在web.xml中配置过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>