SpringMVC开发简介
SpringMVC开发步骤
- 导入SpringMVC相关依赖
porm.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
- 配置SpringMVC核心控制器(DispatchSevlet)
web.xml:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>//引入spring的配置文件sping-mvc.xml
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_mvc-servlet.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>
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
HelloController.java:
@Controller//控制器注解
public class HelloController{
@RequestMapping(value = \"/do\")//dispatchservlet分发路径
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject(\"msg\",\"hahahha\");
mav.setViewName(\"show.jsp\");
return mav;
}
}
- 配置SpringMVC核心文件spring-mvc.xml(组件扫描)
spring-mvc-servlet.xml:
<beans xmlns=\"http://www.springframework.org/schema/beans\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:context=\"http://www.springframework.org/schema/context\"
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\">
<!-- 组件扫描 -->
<context:component-scan base-package=\"com.controller\"/>
</beans>
- 测试
问题1:跳转页面404
问题定位: JSP文件中的超链接标签的href属性加入了“/”,导致跳转域名是上一级目录
问题解决: 不加“/”,或者去Tomcat的Server.xml文件中让path为空(即去掉项目名称)
SpringMVC流程分析
- 用户发送请求到前端控制器DispatchServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射找到具体的处理器(可根据XML配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
- DispatcherServlet调用HandlerAdaptor处理适配器
- HandlerAdapptor适配调用具体的处理器Controller
- Controller执行业务逻辑返回ModelAndView
- HandlerAdaptor将ModelAndView对象返回给DispatcherServlet
- DispatcherServlet调用视图解析器ViewResolver视图解析器处理ModelAndView
- ViewResolver解析完成返回具体的View给DispatherServlet
- DispatcherServlet将View进行渲染(将模型数据进行填充页面)后返回给客户端
SpringMVC注解解析
@RequestMapping
作用:用于建立请求URL和处理请求方法之间的对应关系
位置:
- Controller类上,请求URL访问的第一级目录,不写的话默认为根目录
- 具体的方法上,请求URL访问的第二级目录,与一级目录共同构成访问的虚拟路径
属性:
- value: 用于指定请求的URL,如
value=\"/hello\"
- method: 用于指定请求的方式,如
method=RequestMethod.GET
- params: 用于指定限定请求参数,如
params=\"name\"
表示请求参数必须有name属性
组件扫描
SpringMVC基于Spring容器,需要将Controller等对象放到Spring容器中,所以需要进行组件扫描才能使用注解,如<contex: component-scan base-package=\"com.rsk.controller\">
视图解析器
将SpingMVC默认的视图解析器(DispatcherServlet.properties)进行重新配置,主要修改URL前缀和后缀
<!--配置视图资源解析器-->
<bean id=\"viewResolver\" class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">
<property name=\"prefix\" value=\"/jsp/\"></property>
<property name=\"suffix\" value=\".jsp\"></property>
</bean>
SpringMVC数据响应方式
页面跳转
- 直接返回字符串:将返回的字符串与视图解析器的前后缀拼接起来后跳转
- 返回ModelAndView对象
回写数据
- 直接返回字符串:
@ResponseBody
可以指定SpringMVC直接返数据String或者封装成JSON格式的String,不需要进行视图解析。 - 返回对象或集合:在spring-mvc.xml中添加
<mvc:annotation-driven/>
来加载注解驱动,依然需要@ResponseBody
SpringMVC获得请求数据
参数类型一致
获得请求参数:GET:name=value&name=value...
,服务器需要对其进行封装,SpringMVC可接受如下类型参数:
- 基本类型参数:需要在参数列表添加与URL字段对应的String或者Int(SpringMVC自动转换)
- POJO(Plain Ordinary Java Object)类型参数:直接在方法参数列表使用对象如
User user
- 数组类型参数:直接在方法参数列表使用字符串数组
- 集合类型参数:POST请求需要将其封装到一个POJO对象中,AJAX给的contexType是一个JSON请求,则可以直接在方法参数列表获取如
@ResponseBpdy List<User> userList
参数类型不一致
当请求的参数名称与Controller的业务方法中的名称不一致时,就需要使用注解@RequestParam
注解显示绑定参数
- value:请求参数名称
- required:指定该参数是否必须包括,提交时没有该参数则会报错
- defaultValue: 当没有指定参数时,使用指定默认值赋值
@ResponseBody
public void save8(@RequestParam(value = \"name\", required = false, defaultValue = \'defaltName\') String username, int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
获取Servlet的相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用对象如下:
- HttpServletResponse
- HttpServletRequest
- HttpSession
@RequestMapping(\"/do9\")
@ResponseBody
public void save9(HttpServletRequest req, HttpServletResponse res, HttpSession session) throws IOException{
System.out.println(req);
System.out.println(res);
System.out.println(session);
}
获取请求头
@RequestHeader
使用@RequestHeader
可以获得请求头信息,相当于javaweb的reques.getHeader(name),有如下属性
- value: 请求头名称
- required:是否必须携带此请求头
@RequestMapping(\"/do10\")
@ResponseBody
public void save10(@RequestHeader(value = \"User-Agent\", required = false) String user_agent) throws IOException{
System.out.println(user_agent);
}
@CookieValue
使用@CookieValue
可以获取指定的cookie值,有如下属性
- value: 指定cookie名称
- required:指定是否必须携带cookie
@RequestMapping(\"/do11\")
@ResponseBody
public void save11(@CookieValue(value = \"JSESSIONID\", required = false) String cookie) throws IOException{
System.out.println(cookie);
}
文件上传
1.文件上传三要素:
- 表单项
type=\"file\"
- 表单提交方式:post
- 表单enctype属性是多部分表单形式,即enctype=“multipart/form-data”
<form action=\"do12\" method=\"post\" enctype=\"multipart/form-data\">
名称<input type=\"text\" name=\"username\"><br/>
文件<input type=\"file\" name=\"upload\"><br/>
<input type=\"submit\" value=\"提交\">
</form>
2.单文件上传步骤
- 导入fileupload和IO依赖坐标
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version></version>
</dependency>
- 配置文件上传解析器
<!--配置文件上传解析器-->
<bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">
<!--上传文件总大小-->
<property name=\"maxUploadSize\" value=\"5242800\"/>
<!--上传单个文件大小-->
<property name=\"maxUploadSizePerFile\" value=\"5245555\"/>
<!--上传文件编码类型-->
<property name=\"defaultEncoding\" value=\"UTF-8\"/>
</bean>
- 编写文件上传代码
@RequestMapping(\"/do12\")
public String save12(String name, MultipartFile file) throws IOException{
String originalFilename = file.getOriginalFilename();
file.transferTo(new File(\"url\" + originalFilename));
return \"fileUpload\";
}
拦截器interceptor
类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理,是AOP思想的具体实现。
- 创建拦截器类实现Handerinterceptor接口
public class myInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//方法执行之前执行
System.out.println(\"prehandle\");
//true放行
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//return之前执行
System.out.println(\"post\");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//方法执行完毕后执行
System.out.println(\"after\");
}
}
- Spring-mvc.xml中配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--资源拦截-->
<mvc:mapping path=\"/do\"/>
<!--拦截器定位-->
<bean class=\"interceptor.myInterceptor\"/>
</mvc:interceptor>
</mvc:interceptors>
- 拦截器应用场景——用户登陆判断(在长时间没有进行操作后,服务器端的session会消失,因此当用户在点击其他操作时候,可利用拦截器的postHandler方法来判断用户session是否可用,如果为null则跳转到登陆页面)
SpringMVC异常处理
- 使用简单异常处理器SimpleMappingExceptionResolver
<!--简单异常处理器配置-->
<bean class=\"org.springframework.web.servlet.handler.SimpleMappingExceptionResolver\">
<property name=\"defaultErrorView\" value=\"error\"/>
<property name=\"exceptionMappings\">
<map>
<entry key=\"java.lang.ClassCastException\" value=\"error\"/>
</map>
</property>
</bean>
- 自定义异常处理
- 创建异常处理类实现HandlerExceptionResolver
public class myExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
return null;
}
}
- 配置异常处理类
<!--自定义异常配置-->
<bean class=\"Exception.myExceptionResolver\"/>
问题1 WEB-INf下的静态资源访问
解决方案:在spring-mvc.xml中配置访问地址
<!--开发资源访问-->
<mvc:resources mapping=\"/img/**\" location=\"/img/\"/>
<!--默认开发资源访问,交给Tomcat服务器去找-->
<mvc:default-servlet-handler/>
问题2 解决中文乱码
解决方案: 在web.xml中配置全局的过滤器,指定解码方式为UTF-8
<!--配置全局的过滤Filter, 解决乱码问题-->
<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>
来源:https://www.cnblogs.com/rskblog/p/16257527.html
本站部分图文来源于网络,如有侵权请联系删除。