SpringMVC是什么
- SpringMVC是一个基于MVC模式的WEB/表现层框架,它解决WEB开发中常见的问题:参数接收、文件上传/下载、表单验证、国际化等等;
- SpringMVC作为Spring框架一个非常重要的功能模块,可以与Spring无缝集成,提高开发效率;
- Spring是一个轻量级的Java 开发框架,为了解决企业应用开发的复杂性而创建。SpringMVC以Spring框架为核心,为应用程序中的Web层(表现层)提出的一套优秀的解决方案;
注意:SpringMvc的功能就是之前Servlet的功能,可以理解为使用SpringMVC代替了Servlet;
SpringMVC有什么用
- 匹配请求并接收请求参数
- 调用业务代码处理请求
- 响应跳转
SpringMVC的使用步骤
1、导包
2、配置前端控制器(web.xml)
<?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>myspringmvc</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化配置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
<!--启动就加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射路径 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- <url-pattern>*.do</url-pattern> -->
<!--拦截所有html,css,jsp... -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- 拦截静态资源html,css,但是不拦截jsp -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--拦截器-->
<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>
</web-app>
3、编写控制器
public class HiController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("我经历了什么。。。");
return null;
}
}
4、匹配请求
第一种:xml配置
<bean id="/hi.do" class="cn.itsource.controller.HelloController"></bean>
第二种:注解
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<context:component-scan base-package="cn.itsource.controller"></context:component-scan>
<!--静态资源放行 -->
<mvc:default-servlet-handler/>
<!-- @RequestMapping生效 -->
<mvc:annotation-driven/>
</beans>
package cn.itsource.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello.do")
private void print() {
System.out.println("abc");
}
}
5、跳转响应
public class HelloController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//handleRequest - 处理请求
System.out.println("来了,老弟!!!");
//响应
ModelAndView mv = new ModelAndView();//这个对象用来保存数据和数据 ,方便传输
mv.addObject("name", "james"); //设置响应的数据name
mv.addObject("age", 20); //设置响应的数据age
mv.setViewName("/WEB-INF/hello.jsp");//设置响应视图的路径 WEB-INF下的资源不能直接访问,必须通过转发
return mv;
}
}
6、编写jsp
<body>
<h1>来了,老弟!!!</h1>
<h2>你的名字是:${name }</h2>
<h2>你的年龄是:${age }</h2>
</body>
7、测试
浏览器输入:localhost/hello.do
接收参数
第一种:传入参数
/**
* 参数接收
*/
@RequestMapping("/form2")
public void login1(String name,String pwd) {
System.out.println(name);
System.out.println(pwd);
}
第二种:传入对象
/**
* 对象接收
* @param user
*/
@RequestMapping("/form3")
public void login2(User user) {
System.out.println(user);
}
响应请求
第一种:modelandview
@RequestMapping("/form4")
public ModelAndView login4() {
ModelAndView view = new ModelAndView();
view.addObject("name", "小龙女");
view.addObject("age",25);
view.setViewName("/WEB-INF/view/web.jsp");
return view;
}
第二种:Model参数
/**
* 响应第三种
*/
@RequestMapping("/form5")
public String login5(Model model) {
model.addAttribute("name", "王天霸");
return "/WEB-INF/view/web.jsp";
}
第三种:map集合
@RequestMapping("/form6")
public String login6(Map<Object,Object> map) {
map.put("name", "威整天");
return "/WEB-INF/view/web.jsp";
}
视图解析器
- SpringMvc提供了InternalResourceViewResolver,用于统一管理响应视图的匹配;
- 使用之后,响应的数据就会交给这个视图解析器进行解析,然后转向响应的页面,控制器中响应视图写法就比较简单了;
<!-- 设置视图路径的前后缀,该配置可以让我们写视图路径的时候更简单 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
路径简写:
请求转发:forward
- SpringMVC默认就是使用的是转发的方式进行跳转的。上面的案例都是转发,转发的值都是放到request请求作用域,下一个页面可以取出;
- Url地址栏中地址不会发生变化;
- SpringMVC中使用"forward:/uri"实现转发:
**
* 使用请求转发
* @return
*/
@RequestMapping("/data05")
public String data5(Model model,HttpSession session){
model.addAttribute("test","张三");//可以取出数据
session.setAttribute("testsession", "张三session");//可以取出数据
return "forward:/data.jsp";
}
请求重定向:redirect
- 重定向就是发出一个全新的请求:
(1) 如果把值放到request请求,下一个页面不能取出
(2) 如果把值放到session会话请求,下一个页面可以取出 - Url地址栏中地址会发生改变;
- SpringMVC中使用"redirect:/uri"即可实现重定向;
@RequestMapping("/data06")
public String data6(Model model,HttpSession session){
model.addAttribute("test","张三");//不可以取出数据
session.setAttribute("testsession", "张三session");//可以取出数据
return "redirect:/data.jsp";
}
解决乱码问题
第一种:实现filter接口
- 写一个类去实现Filter接口,并实现接口中的所有方法;
- 在web.xml中配置或者使用注解配置【@WebFilter(“过滤器路径”)不推荐】
ublic class FirstFilter implements Filter {
public FirstFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
chain.doFilter(request,response);//放行
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
第二种:xml配置
<!-- 支持UTF-8编码 -->
<filter>
<filter-name>characterEncoding</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>
<!--强制指定字符编码,即使request或response设置了字符编码,也会强制使用当前设置的,任何情况下强制使用此编码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>