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);
}
}