springMVC入门
SpringMVC
入门
引入相关jar包或坐标
Spring-context,spring-web,spring-webmvc,servlet-api,jsp-api
相应配置
创建web工程
在web.xml下做相应配置
<web-app> <display-name>Archetype Created Web Application</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:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> 在程序加载的时候就执行,这样子就会引入相关的配置启动spring的ioc注入 </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <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>
在资源路径下配置springmvc.xml,需要开启spring的ioc注入
<context:component-scan base-package="com.yyx.mvc"></context:component-scan> <!-- 视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> 解析的路径 <property name="suffix" value=".jsp" /> </bean> <!-- mvc注解支持 --> <mvc:annotation-driven/>
在/WEB-INF/pages/新建一个.jsp文件写入你想显示的内容
最后写你的controller层的java代码
@Controller public class HelloSpringmvc { @RequestMapping(path = "/hello") 和servelet的原理一下,当访问这个路径的时候就会执行,建立一个映射关联 path和value属性一样的效果,只写value的时候可以省略属性名 method属性决定接收什么请求,枚举类型RequestMehod params指定访问时必须传输的属性 headers指定要求的请求头 public String hello(){ return "success";通过视图解析器进行跳转,和对应的名字一样的jsp文件显示 } }
成功编写springmvc的入门程序
请求参数的绑定
实体类都需要序列化,序列化可以形成字节流,可以在不同的平台应用程序里面跑
零散数据
请求地址中加入类似htttp://......?username=XXX&password=XXX
可以在对应的方法中的参数中直接添加,会通过key,value的形式,匹配key也就是username对应参数中的username,就能接收到前端请求来的数据
表单数据
建立一个实体类,实体类的属性名要和表单的每个数据的name一样,如果实体类中有引用类型的数据,比如又是i一个类,可以在表单中用类名.属性给实体类中的类赋值。然后就可以直接在请求的方法中的参数使用实体类来作为参数接收
如果有list或者map集合,list对应在表单中写list属性名[索引].属性添加数据,map在对应的表单中写map属性名[key].value
自定义类型转换器
写一个类implements Converter<S, T>实现方法
常用注解
@RequestParam
解决在方法中你可以写与传过来参数不同名字的参数,但是在注解的name属性中要写与传过来的参数名字相同
required属性默认为true代表必须有参数传递并且必须和name属性的名字相同
@RequestBody
获取请求体的内容,不适用于get请求(get不包含请求体),获得整体的key=value&key=value……的形式
@PathVaribale
用于绑定url中的占位符,如controller层中地址映射为/user/{id} ,{id}就是占位符,请求地址就可写/user/10
@RequestHeader
用于获得请求头的值
@CookieValue
获取指定名称的Cookie值
@ModelAttribute
出现在方法上,表示当前方法会在控制器的方法之前。
@SessionAttribute
用于多次执行控制器方法间的参数共享,将参数存入session域,需要在方法中加入Model或ModelMap参数去add或者getAttribute值 SessionStatus可以清楚Session
响应数据
返回字符串
通过视图解析器,将你的返回的字符串作为名字,后缀为视图解析器中添加的如.jsp,最后就会解析到这个网页中,可以在方法中添加Model model参数,addAttribute将你需要查询的东西放进去然后解析后的页面可以通过el表达式取得里面的东西
关键字方式,返回值为"foward:地址"转发方式,"redirect:地址"重定向底层加了前缀的默认名称
void类型
默认请求视图解析器中设置的路径下的方法名.jsp的文件,也可以通过写入request和response参数,通过request的请求转发或者response的重定向或response的输出流跳转到自己想去的页面(后者不会通过视图解析器)
ModelAndView
ModelAndView的对象中setViewName会找视图解析器,返回字符串的底层就用到了ModelAndView
ResponseBody响应json数据
导入有关json数据的jar包或坐标,jackson-databind,jackson-core,jackson-annotations
<!-- 在 springmvc 的配置文件中可以配置,静态资源不过滤:--> <!-- location表示路径,mapping表示文件,**表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/scripts/" mapping="/javascript/**"/>
发送原生ajax请求
$({ url:请求地址,contentType:"application/json;charset=UTF-8"发送过去的数据类型,data:‘{}‘数据,dataType:预期服务器返回的值,type:"请求方式默认get",success:"成功处理函数"})
在返回类型的对象上加@ResponseBody可以将对象变成json数据
文件上传
导入commons-fileupload,commons-io
传统方式上传
form表单中的enctype必须是multipart/form-data以及是post请求进行上传
public String fileupload1(HttpServletRequest request){ String realPath = request.getSession().getServletContext().getRealPath("/uploads/"); File file = new File(realPath); if(!file.exists()){ file.mkdir(); } DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> fileItems = upload.parseRequest(request); for (FileItem item:fileItems) { if(item.isFormField()){ //说明普通表单项 }else { //说明是上传文件项 String filename = item.getName(); try { item.write(new File(realPath,filename)); System.out.println(realPath); item.delete();//删除临时文件 } catch (Exception e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); } return "success"; }
SpringMVC文件上传
配置文件解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> id必须叫这个 <property name="maxUploadSize" value="字节为单位" /> </bean>
方法
public String fileload2(HttpServletRequest request,MultipartFile upload){ String realPath = request.getSession().getServletContext().getRealPath("/uploads/"); File file = new File(realPath); if(!file.exists()){ file.mkdir(); } String filename = upload.getName(); try { upload.transferTo(new File(realPath,filename)); } catch (IOException e) { e.printStackTrace(); } return "success"; } MultipartFile的参数名必须和form表单中input的type为file的name一样
SpringMVC跨服务器方式的文件上传
导入jersey-core和jersey-client
public String fileload3(,MultipartFile upload){ String path="另外一个服务器的路径"; String filename = upload.getName(); Client client = Client.create(); WebResource resource = client.resource(path + filename); try { resource.put(upload.getBytes()); } catch (IOException e) { e.printStackTrace(); } return "success"; }
SpringMVC拦截器
异常处理器
编写一个自定义异常
编写异常处理器类实现HandlerExceptionResolver,解决中使用ModelAndView
将异常处理器的类写入xml中
拦截器
编写拦截器的类实现HandlerInterceptor
配置拦截器xml
preHandle预处理 controller执行前
postHandle后处理 controller执行后,跳转页面之前
afterCompletion 跳转页面执行后,该方法执行,最后执行
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path=""/>配置你要拦截的方法 <mvc:exclude-mapping path=""/>配置你不要拦截的方法 <bean class=""></bean> 配置你的拦截器的类 </mvc:interceptor> </mvc:interceptors>