SpringMVC学习笔记

这篇博客详细介绍了SpringMVC的配置过程,包括maven依赖、web.xml的配置、视图解析器的设置以及Controller的使用。还讨论了处理请求参数、返回值、异常处理和拦截器的实现。此外,提到了如何解决POST请求乱码问题并返回JSON数据。
摘要由CSDN通过智能技术生成

SpringMVC学习笔记

maven依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.5</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

配置文件

web.xml配置文件

配置开局创建springmvc容器对象
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--自定义springmvc的配置文件的位置-->
    <init-param>
        <!--springmvc的配置文件的位置的属性-->
        <param-name>contextConfigLocation</param-name>
        <!--指定的自定义文件的位置-->
        <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!--指定对象创建时间,大于等于0的整数,数字越小,创建越早-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--使用框架的时候,url-pattern可以有两种值
            1.使用拓展名方式,常用的有  *.do,*.mvc,*.action
            2.使用"/"
        -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
解决使用"/"的问题
<!--如果上面配置时使用/,就会出现访问静态资源出现问题,可以再springmvc配置文件中加入以下句子-->
<mvc:default-servlet-handler />
<!--这样以后所有资源都会给tomcat默认的servlet处理,@RequestMapping就会失效,这时候加入以下句子即可-->
<mvc:annotation-driven />



<mvc:resources mapping="images/**" location="/images/" />
<mvc:annotation-driven />
配置过滤器解决post乱码问题
<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>
    <init-param>
        <param-name>forceRequeestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

springMVC.xml

视图解析器
  • 使用后,框架会使用视图解析器的(前缀+逻辑名称+后缀)组成完整路径
<!--声明视图解析器,帮助开发人员设置视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/view/" />
    <!--后缀-->
    <property name="suffix" value=".jsp" />
</bean>
//原来
mv.setViewName("/WEB-INF/view/hello.jsp");
//使用后
mv.setViewName("hello");

Controller类

@Controller
public class MyController {
	/**
	*	method:表示接收的请求方式
	*	不赋值默认就没有请求方式的限制
	*	参数列表:三个参数可以加,可以不加,要使用可以直接加入,框架会自动赋值
	*/
    @RequestMapping(value={"/some.do","/first.do"},method = RequestMethod.GET)
    public ModelAndView doSome(HttpServletRequest request, 
           HttpServletResponse response, HttpSession session){
        ModelAndView mv=new ModelAndView();
        //相当于request.setAttribute("","")
        mv.addObject("msg","dsafasdfdasfaewf");
        mv.setViewName("/show.jsp");
        return mv;
    }
}

请求方式的不同

@RequestMapper(value="/xxx" method=RequestMethod.GET)

@GetMapper(value="/xxx")
@PostMapper("/xxx")
@DeleteMapper("/xxx")
@PutMapper("/xxx")

接收参数

参数样式

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • 用户提交的参数
接收用户提交参数
同名接收
/**
*	要求:
*		控制器方法的参数名和请求参数名必须一直
*		同名的赋值给同名的,顺序无所谓
*	框架接收请求参数:
*		1.使用request对象接收参数
*			String strName=request。getParameter("name");
*		2.springmvc框架通过DispatcherServlet调用对应方法时
*			按照名字对应,把接收的参数赋值给形参
*			框架会自动调用类型转换,把String转为其他类型
*	400错误码:若空字符串""转为int就会出错,类型转换错误,使用Integer就不会出现错误,若为其他类还是会出错
*/
@RequestMapping("/hello.do")
public ModelAndView doSome(String name,int age);
注解接收
/**
*	@RequestParam:逐个接收参数,解决参数名形参名不一样的问题
*	value:请求中参数名
*	required:请求中是否必须包含此参数,默认为true,若没有则报错
*/
@RequestMapping(value={"/some.do","/first.do"},method = RequestMethod.GET)
public ModelAndView doOther(@RequestParam(value = "name",required = false) String name);
对象接收
/**
*	会调用对象中的set方法给同名属性赋值
*/
public ModelAndView doOther(Student student);

返回值

ModelAndView
String
  • 返回视图
//返回值表示逻辑视图名称
public String doSome(){
    return "/hello.jsp";
}
  • 返回String数据
//社会produces属性,可以解决返回字符串乱码问题
@RequestMapping(value={"/some.do","/first.do"},produces = "text/plain,charset=utf-8")
@ResponseBody
public String doSome(){
    return "name";
}
void

了解

Object
注解驱动
<!--springmvc.xml中加入-->
<mvc:annotation-driven />
实现Ajax
  • 返回json
//加了@ResponseBody注解后会根据前端代码中的dataType类型,springmvc自动把student转换为json格式返回
@RequestMapper(value="/student.do")
@ResponseBody
public Student doJsonOfStudent(){
    Student student=new Student("lisi",20);
    return student;
}
  • 返回json数组
public List<Student> doJsonOfStudentArray(){
    return list;
}

转发与重定向

//转发,无视视图解析器,可以访问WEB-INF目录下的东西
mv.setViewName("forward:/hello.jsp");
//通过mv添加的属性,jsp文件可以直接${msg}访问到
mv.addObject("msg","aaaaa");


//重定向,无视视图解析器,不能访问WEB-INF目录下的的东西
mv.setViewName("redirect:/hello.jsp");
//通过mv添加的属性,jsp只能通过以下两种方式访问
mv.addObject("msg","aaaa");
${Param.msg}	${request.getParameter("msg")}

异常处理

//加入了这个就能处理@Controller的异常
@ControllerAdvice
public class MyException {
    //若不写value,所有的异常都会交到这里处理
    @ExceptionHandler(value=RunTimeException.class)
    public ModelAndView doMyException(Exception ex){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","出现错误了");
        mv.addObject("ex",ex);
        mv.setViewName("forward:/myError.jsp");
        return mv;
    }
}

拦截器

<mvc:interceptors>
	<mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/userController/login"/>
    	<bean class="com.liucheng.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器");
        HttpSession session = request.getSession();
        Object user=session.getAttribute("user");
        if(user==null){
            response.sendRedirect(request.getContextPath()+"/user/login");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值