文章目录
SpringMVC
1.SpringMVC简介
SpringMVC是Spring框架中一个模块,Spring和SpringMVC无需通过中间整合就可以一起使用。
SpringMVC是一个基于mvc模式的web框架。
2.SpringMVC框架的原理
第一步:发起请求到前端控制器(DispatchServlet)
第二步:前端控制器请求处理器映射器(HanderMapping)查找Hander
第三步:处理器映射器向前端控制器返回执行链(包含了Hander)
第四步:前端控制器调用处理器适配器(HanderAdapter)去执行Hander
第五步:处理器适配器执行Hander
第六步:Hander执行完毕返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器进行视图解析
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
第十一步:前端控制器向用户响应结果
3.SpringMVC组件详解
3.1 前端控制器
DispatchServlet:(不需要程序员开发)
作用:接收请求,响应结果。相当于一个中央处理器
它的存在为了减少其他组件之间耦合度
3.2 处理器映射器
HanderMapping:(不需要程序员开发)
作用:根据请求的url查找对应的hander
3.3 处理器适配器
HadnerAdapter:(不需要程序员开发)
作用:按照规则去执行Hander
3.4 处理器
Hadner:(需要开发)
作用:处理用户的请求
3.5 视图解析器
View Resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真实视图
3.6 视图
View:(需要开发)
4.入门程序
4.1 创建Web项目
4.2 导入依赖
4.3 配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>SpringMVC01</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 前端核心控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
4.4 配置springmvc.xml
<beans>
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置hander -->
<bean name="/test.action" class="com.lxk.controller.UserController"></bean>
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 视图解析器 并且配置前后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.5 编写hander以及测试
5.注解开发
<!-- 开启扫描注解 最终配置在spring配置文件中 -->
<context:component-scan base-package="com.lxk.controller"></context:component-scan>
<!-- 注解的映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
@Controller:表示此类是一个控制器
@RequestMapping("/test.action"):此注解可以放在方法上,实现方法和url的映射
也可以放在控制类上。
在实际开发中不使用上面适配器和映射器.
<!--使用以下配置取代适配器和映射器-->
<mvc:annotation-driven></mvc:annotation-driven>
6.controller方法的返回值
6.1 返回ModelAndView
需要在方法返回之前定义modenAndView。讲model和view分别进行设置
public ModelAndView findall(ModelAndView mv) {
//mv.addObject("name", "张三"); 返回一个基本数据类型
User user = new User();
user.setName("李四 ");
user.setAge(19);
//mv.addObject("user", user); 返回一个对象
User user2 = new User();
user2.setName("李四 2");
user2.setAge(192);
User user3 = new User();
user3.setName("李四 3");
user3.setAge(193);
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
list.add(user3);
mv.addObject("list", list);
mv.setViewName("a");//返回了一个集合
return mv;
}
6.2 返回void
6.2.1 转发
public void findall2(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//...
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
list.add(user3);
request.setAttribute("list", list);
request.getRequestDispatcher("/WEB-INF/jsp/a.jsp").forward(request, response);
}
6.2.2 重定向
public void findall2(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("emp/findemp.action");
}
6.3 返回String
6.3.1 返回逻辑视图名
public String findall2(Model model) throws ServletException, IOException {
model.addAttribute("uname", "张三");
// 返回逻辑视图名会被视图解析器的前后缀影响
return "a";
}
6.3.2 转发
public String findall2(Model model) throws ServletException, IOException {
model.addAttribute("uname", "张三");
// 返回逻辑视图名会被视图解析器的前后缀影响
return "forward:/emp/findemp.action";
}
6.3.3 重定向
public String findall2(Model model) throws ServletException, IOException {
model.addAttribute("uname", "张三");
// 返回逻辑视图名会被视图解析器的前后缀影响
return "redirect:/emp/findemp.action";
}
7.参数绑定
从客户端请求key/value数据,经过参数绑定,将数据绑定到controller方法的形参上。
在SpringMVC中。接收页面提交的数据通常使用方法的形参来接收。而不是在方法体内定义成员变量接收。
7.1 默认支持的类型
HttpServletRequest
HttpServletResponse
HttpSession
Cookie
Model
ModelAndView
7.2 简单类型
//形参的名字必须和前台页面的name属性值保持一致
public String addUser(String uname,String usex,int uage) {
System.out.println(uname);
System.out.println(usex);
System.out.println(uage);
return "";
}
<form action="user/addUser.action" method="post">
姓名:<input type="text" name="uname">
性别:<input type="text" name="usex">
年龄:<input type="text" name="uage">
<input type="submit" value="添加新用户">
</form>
当形参的名字和前台的name属性值不一致的时候可以使用@RequestParam。同时可以设置某一个参数是否是必须的
@RequestParam(value="uname",required=false) String name
//使用required可以设置此参数是否是必须的
//如果没有@RequestParam这个注解 属性都可以为非必须的
//如果设置了@RequestParam这个注解 required默认为true
7.3 bean类型绑定
<form action="user/addUser.action" method="post">
姓名:<input type="text" name="uname">
性别:<input type="text" name="usex">
年龄:<input type="text" name="uage">
<input type="submit" value="添加新用户">
</form>
//Java bean
public class User {
private String uname;
private String usex;
private int uage;
// 省略get set方法
}
//controller 方法
public String addUser(User user){
}
// 前台的参数的名和Java bean的属性名保持一致
7.4 数组类型的参数绑定
<input type="checkbox" value="lanqiu" name="hobbys">篮球
<input type="checkbox" value="zuqiu" name="hobbys">足球
<input type="checkbox" value="paiqiu" name="hobbys">排球
//Java Bean的属性
private String [] hobbys;
8.乱码解决
<!-- 乱码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>