Java小白学习指南【day36】---SpringMVC配置及使用流程

1、认识springMVC

作用:springMVC是表现层框架,底层对Servlet的封装,替代web程序中servelt 控制器那一程

回顾servlet作用:接收参数,处理请求,响应,跳转页面

方式:转发/重定向

执行流程:

image-20201209110635293

2、springMVC入门

  • 创建web动态项目

  • 导入响应jar包

    ① Spring核心容器相关jar包

    com.springsource.org.apache.commons.logging-1.1.1.jar

    spring-beans-4.1.2.RELEASE.jar

    spring-context-4.1.2.RELEASE.jar

    spring-core-4.1.2.RELEASE.jar

    spring-expression-4.1.2.RELEASE.jar

    ② Spring测试相关jar包

    spring-test-4.1.2.RELEASE.jar

    spring-aop-4.1.2.RELEASE.jar – Spring测试需要导入此包

    ③ SpringMVC相关jar包:

    spring-web-4.1.2.RELEASE.jar – Spring对web项目的支持

    spring-webmvc-4.1.2.RELEASE.jar – SpringMVC核心包

  • 在web.xml配置前端控制器

  <servlet>
      	<!-- 配置前端控制器 -->
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      	<!-- 告诉web.xml配置的springMVC -->
        <init-param>
                   <param-name>contextConfigLocation</param-name>
                   <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
     	 <!-- 映射路径的设置 -->
        <url-pattern>/</url-pattern>
  </servlet-mapping>

设置SpringMVC配置文件创建resources

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">
	 	   <!-- 静态资源放行 = 静态资源可以不拦截 -->
	       <mvc:default-servlet-handler/>
</beans>

3、前端控制器编写方式

共有三种方式,用的最多的为方式三:

方式一(实现org.springframework.web.servlet.mvc.Controller;接口)

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloMvc implements Controller{
    
    
	//前端控制器编写的方式一,implements Controller
	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    
    
		System.out.println("你好controller!");
		return null;
	}
}

方式二(实现 implements HttpRequestHandler )

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloMvc2 implements HttpRequestHandler {
    
    
	// 前端控制器编写的方式二,implements HttpRequestHandler
	@Override
	public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
    
    
		System.out.println("我是前端控制器编写的方式二");
	}
}

方式三(普通类+注解)

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//@Controller//spring会识别这个注解,进行扫描,并且创建该类的实例化对象
@Component  //也可以使用@Component(普通类) 、 @Repository(dao层) 、@Service(service层)均可
@RequestMapping("/user")
public class HelloMvc3 {
    
    
	// 前端控制器编写的方式三,普通类+注解
	@RequestMapping("/eat")
	public void eat(){
    
    
		System.out.println("前端控制器编写的方式三,普通类+注解");
	}
	@RequestMapping("/put")
	public void put(){
    
    
		System.out.println("Java是一门面向对象的语言");
	}
}

方式三还需要再spring-mvc.xml引入context命名空间及约束

<!-- 扫描包路径:上下文组件扫描 ,Spring容器会去扫描cn.itsource这个包及其子包中所有的类,如果发现类上有类似@Controller这样注解,就会创建该类的对象,并进行管理-->
	<context:component-scan base-package="cn.itsource"></context:component-scan>
	
	<!-- 开启Spring对Mvc的支持 = 能够使用@Requestmapping注解 -->
	<mvc:annotation-driven></mvc:annotation-driven>

4、全注解

  • 匹配请求:@RequestMapping(“/hehe”) 前提:spring-mvc.xml 开启注解支持

    可以写在类和方法上面

  • (1) 实例化对象:类所在包路劲,需要被是扫描

    <context:component-scan base-package=“cn.itsource”> 父包,所有子包都会被扫描

    <context:component-scan base-package=“cn.itsource._03Controller”> 精确扫描某个包:只会扫描本包

    只能放在类的上面

    ① @Controller

    ② @Service

    ③ @Repository 持久Dao

    ④ @Component 普通类

    注意: 相互使用

5、接收请求参数

共有四种方式:

  1. 通过传统的HttpServletRequest接收;

  2. 通过控制器的执行方法的参数接收;

  3. 通过对象来接收;

  4. 通过url中的参数接收(restfull风格) @PathVariable(“id”)转换;

@Controller
@RequestMapping("/login")
public class GetParamController {
    
    
	//通过请求获取
	@RequestMapping("/form1")
	public void parm1(HttpServletRequest req ){
    
    
		String name = req.getParameter("name");
		String pwd = req.getParameter("pwd");
		System.out.println(name+"---------"+pwd);
	}
	//通过参数获取
	@RequestMapping("/form2")
	public void parm2(String name , String pwd){
    
    //参数名名字必须与xml中的对应
		System.out.println(name+"---------"+pwd);
	}
	//使用对象进行获取
	@RequestMapping("/form3")
	public void parm3(User user){
    
    //与类中字段名无关
		System.out.println(user);
	}
	//restful风格:Url地址栏参数提取
	@RequestMapping("/form4/{id}/{mm}")
	public void parm4(@PathVariable("id")String name , @PathVariable("mm")String pwd){
    
    //与类中字段名无关
		System.out.println(name+"---------"+pwd);
	}

6、过滤器

主要应对post请求乱码问题:可以自定义过滤器,SpringMVC写好的过滤器

web.xml中进行配置

<!-- 自定义配置过滤器,告诉web有一个过滤器 -->
	<filter>
		<filter-name>filter</filter-name>	
		<filter-class>cn.xxxx.myfilter.MyFilter</filter-class>
		<init-param>
			<param-name>enc</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>filter</filter-name>
		过滤器路径匹配,所有文件都需要从过滤器过
		<url-pattern>/*</url-pattern>
	</filter-mapping> 
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//过滤器是去实现接口,因为是自己的去指定过滤规范
public class MyFilter implements Filter{
    
    
	String enc;
	
	//验证过滤器启动
	public MyFilter(){
    
    
		System.out.println("这是过滤器");
	}

	@Override
	public void destroy() {
    
    
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2)
			throws IOException, ServletException {
    
    
		System.out.println("开始过滤........");
		req.setCharacterEncoding(enc);//对请求设定编码
		arg2.doFilter(req, resp);//放行!
	}
	
	//初始化方法,就会获取参数,并且封装进对象中
	@Override
	public void init(FilterConfig arg0) throws ServletException {
    
    
		enc = arg0.getInitParameter("enc");
		//System.out.println(enc);
	}

}

<!-- SpringMVC写好的过滤器 -->
	<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>
	</filter>
	<filter-mapping>
		<filter-name>characterEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

7、响应跳转向页面传值

共有三种方式:传递数据就是Controller往前台(页面)传递数据;

  1. 通过传统的HttpServletRequest传递;

  2. 通过ModelAndView对象传递;

  3. 通过Model对象传递;

@Controller
@RequestMapping("/login")
public class GetParamController {
    
    

	// 通过传统的HttpServletRequest传递
	@RequestMapping("/form5")
	public void parm5(HttpServletRequest req , HttpServletResponse resp) throws ServletException, IOException {
    
    
		req.setAttribute("message5", "你说什么鬼!");//存入请求对象,向前台共享数据
		//转发的时候不会走视图解析器
		req.getRequestDispatcher("/jsp/model2.jsp").forward(req, resp);
	}
	
	// 通过传统的Model传递
	@RequestMapping("/form6")
	public String parm6(Model model) {
    
    //就当作是request对象
		model.addAttribute("message6", "太累了!!");
		//这里还可以传一个集合,数组,或者对象
		User user = new User("你是谁","6666");
		model.addAttribute("user", user);
		//return "/jsp/model2.jsp";//返回的是一个路径
		//使用视图解析器
		//return "jsp/model2";//返回的是一个路径
		//转发是不会走视图解析器,开始的/区别于绝对路径与相对路径
		//return "forward:/jsp/model2.jsp";//转发的绝对路径
		//return "forward:jsp/model2.jsp";//转发的相对路径  /login/jsp/model2.jsp,相对于当前设定的地址
		//重定向不能够取值,所以前端看不到值
		return "redirect:/jsp/model2.jsp";
	}

	// 通用ModelAndView对象传递
	@RequestMapping("/form7")
	public ModelAndView parm7() {
    
    
		ModelAndView mv = new ModelAndView();
		mv.addObject("message7", "奈史密斯");  
		mv.setViewName("/jsp/model2.jsp");
		return mv;
	}

8、Spring-MVC.xml中配置视图解析器

SpringMVC默认是转发

  • 显示forword: 转发:不会经过视图解析器 一般不用

    • forword:/jsp/model2.jsp 加了斜杠绝对路劲
    • forword:jsp/model2.jsp 相对路劲,相对于当前的路劲 /login/jsp/model2.jsp
  • 显示redirect: 重定向: 不会经过视图解析器

<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/"></property><!-- 前缀prefix:会自动在返回值前面加个上/ -->
		<property name="suffix" value=".jsp"></property><!-- 前缀suffix:会自动在返回值后面加个上.jsp -->
	</bean>
请求转发(forward) 重定向(redirect)
访问WEB-INF *√* *X*
request传参 *√* *X*
全新请求(URL变化) *X* *√*
访问外网 *X* *√*

猜你喜欢

转载自blog.csdn.net/WLK0423/article/details/110918610