这篇文章给大家介绍springMVC框架是什么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
SpringMVC
概念:SpringMVC是一种基于java的实现MVC设计模型的请求驱动类型的轻量级web框架,属于springFramework的后续产品,已经融合在Spring Web Flow里面,Spring框架提供了构建web应用程序的全功能MVC模块,使用Spring可插入的MVC框架,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC框架。
它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无序实现任何接口,同时它还支持RESTful编程风格的请求。
入门代码:
第一步:配置前端控制器,在web.xml中
<!--配置前端控制权-->
<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>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、创建控制类
@Controller
public class HelloController {
@RequestMapping(path = "/hello")//用于建立请求URL和处理请求方法之间的对应关系
/*
* 属性;path/value ,映射路径
* method,当前方法可以接受怎么样的请求方式
* params,用于请求参数的条件
* handers,发送的请求必须包含请求头
* */
public String sayHello(){
System.out.println("hello StringMvc");
return "success";
}
}
3、在资源文件夹下创建配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="lianbang.wu"></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>
<!--开启-springmvc框架注解支持 自动配置处理器映射器和处理器适配器-->
<mvc:annotation-driven />
<!--配置类型转换器-->
<bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="lianbang.wu.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--前端控制权哪些静态资源不拦截-->
<mvc:resources mapping="/js/**" location="/js/**"/>
</beans>
程序解析:
1、启动服务器,加载一些配置文件
2、发送请求,后台处理请求
组件介绍:springmvc框架基于组件方式执行流程
前端控制器:DispatcherServlet,它相当于mvc中的c,由它调用其他组件处理用户的请求,降低组件间的耦合性
处理器映射器:HandlerMapping,负责根据用户请求找到handler(处理器)
处理器适配器:HandlerAdapter,对处理器进行执行
处理器:Handler,它就是我们开发中要编写的具体业务控制器
视图解析器:ViewResolver,负责处理结果生成view视图
请求参数绑定
入门代码:
1、发送请求参数
<form action="/param/testParam" method="post">
用户名:<input type="text" name="username"/><br>
</form>
2、请求参数绑定,自动进行同名参数的绑定
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/testParam")
public String testParam(String username){
System.out.println("执行了。。。"+username);
return "success";
}
}
请求参数绑定实体类:
1、创建实体类
public class DemoClass implements Serializable {
private String username;
private String password;
private Double money;
//------省略get,set方法,自行添加
}
2、发送请求
<form action="/param/save" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br>
</form>
3、自动进行实体类型绑定
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/save")
public String save(DemoClass demoClass){
System.out.println(demoClass);
return "success";
}
}
注意:解决POST请求中文乱码:添加过滤器,在web.xml中添加
<!--配置解决中文乱码的过滤器-->
<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>
请求参数绑定集合类型:
1、发送请求
</form>
用户id:<input type="text" name="list[0].id"/><br>
用户年龄:<input type="text" name="list[0].age"/><br>
</form>
2、创建对应的实体类
3、自动进行参数绑定
自定义内容转换器:解决数据内容转换异常问题
第一步:定义一个类,实现Convrter接口,该接口有两个泛型,分别表示接受的类型和目标类型
//自定义类型转换器
public class StringToDateConverter implements Converter <String , Date> {
@Override
public Date convert(String s) {
if (s == null){
throw new RuntimeException("请传入数据");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = df.parse(s);
return date;
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("数据类型转换异常");
}
}
}
第二步:注册类型转换器
<!--开启-springmvc框架注解支持 自动配置处理器映射器和处理器适配器-->
<mvc:annotation-driven conversion-service="cs"/>
<!--配置类型转换器-->
<bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="lianbang.wu.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
获取servlet原生API
//获取原生API
public String testServlet(HttpServletRequest request, HttpServletResponse response){
return "success";
}
常用注解:
@RequsetParams
作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:value,请求参数中的名称
required,请求参数重是否必须提供此参数,默认值:true,表示必须提供,如果不提供将报错。
//@RequestParam
public String testRequestParam(@RequestParam(name = "name") String username){
return "success";
}
@RequsetBody
作用:用于获取请求体内容,直接使用得到是key=value&key=value···结构的数据,get请求不适用
属性:required;是否必须有请求体,默认值是true,当取值为true时,get请求方式会报错,如果取值为false,get请求得到null。
//@RequestBody
public String testRequestBody(@RequestBody String body){
System.out.println(body);
return "success";
}
@PathVariable
作用:用于绑定url中的占位符的
属性:value:指定url中的占位符名称
Restful风格的URL:
1、请求路径一样,可以根据不同的请求方式去执行后台的不同方法
2、restful风格的URL优点:1、结构清晰,2、符合标准,3、易于理解,4、扩展方便
//@PathVariable
@RequestMapping("/testPathVariable/{uid}")
public String testPathVariable(@PathVariable(name = "uid") String id){
System.out.println(id);
return "success";
}
@HiddentHttpMethodFilter
作用;由于浏览器的form表单只支持GET和POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持GET,POST,PUT和DELETE
使用方法:
第一步:在web. xml中配置该过滤器
第二步:请求方式必须使用POST请求
第三步:按照要求提供_method请求参数,该参数的取值就是我们需要的请求方式。
@RequestHeader
作用:用于获取请求消息头
属性:value:提供消息头名称
required:是否必须有此消息头
//@RequestHeader
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println(header);
return "success";
}
@CookieValue
作用:用于把指定cookie名称的值传入控制器方法参数
属性:value:指定cookie的名称
required:是否必须有此cookie
//@CookieValue
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookie){
System.out.println(cookie);
return "success";
}
@ModelAttribute
作用:用于修饰方法和参数,出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值
属性:value,用于获取数据的key,key可以上POJO的属性名称,也可以上map结构的key
应用场景:当表当提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
//@ModelAttribute
@ModelAttribute
public void MyShow(){
System.out.println("MyShow执行了");
}
@SessionAttribute
作用:用于多次执行控制器方法间的参数共享
属性:value:用于指定存入的属性名称
type:用于指定存入的数据类型
作用于类上。
Springmvc的响应数据和结果视图
响应返回值是String类型:
//返回值为String
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString执行了");
return "success";
}
响应返回值是void类型:
//返回值为void
public void testvoid(HttpServletRequest request , HttpServletResponse response) throws ServletException, IOException {
System.out.println("testvoid方法执行");
request.getRequestDispatcher("/WEB-INF/Pages/success.jsp").forward(request,response);//请求转发
response.sendRedirect(request.getContextPath()+"/success.jsp");//重定向
//直接响应
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("hello");
}
文件上传
传统方式代码:
<h4>文件上传:传统方式</h4>
<form action="/user/fileupload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传"/>
</form>
@RequestMapping("/fileupload1")
public String fileUpLoad(HttpServletRequest request) throws Exception {
System.out.println("文件上传");
//使用fileupload组件
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(realPath);
if (!(file.exists())){
file.mkdirs();
}
//解析request对象,获取上传文件想
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem item : fileItems){
//进行判断,当前item对象是否是上传文件
if (item.isFormField()){
//普通表单项
}else {
//上传文件项
String filename = item.getName();
String uuid = UUID.randomUUID().toString().replace("-"," ");
filename=uuid+"_"+filename;
item.write(new File(realPath,filename));
item.delete();
}
}
return "success";
}
springMVC方式代码:
<h4>文件上传:springmvc</h4>
<form action="/user/fileupload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传"/>
</form>
@RequestMapping("/fileupload2")
public String fileUpLoad2(HttpServletRequest request,MultipartFile upload) throws IOException {
System.out.println("springmvc文件上传");
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if (!file.exists()){
file.mkdirs();
}
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-"," ");
filename = uuid+"_"+filename;
upload.transferTo(new File(path,filename));
return "success";
}
跨服务方式代码:
<h4>文件上传:跨服务器</h4>
<form action="/user/fileupload3" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传"/>
</form>
@RequestMapping("/fileupload3")
public String fileUpLoad3(MultipartFile upload) throws IOException {
System.out.println("跨服务器文件上传");
//定义上传文件的服务器路径
String path = "http://localhost:9090/uploads/";
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-"," ");
filename = uuid+"_"+filename;
//创建客户端对象
Client client = Client.create();
//和图片服务器进行连接
WebResource resource = client.resource(path + filename);
// 上传文件
resource.put(upload.getBytes());
return "success";
}
在实际开发中,我们会有很多处理不同功能的服务器,例如:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息
文件服务器:负责存储用户上传文件的服务器
SpringMVC的拦截器:类似于servlet的Filter
1、编写拦截器类
/*
自定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* 预处理,controller方法执行前
* 如果return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* 如果return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了");
return true;
}
/**
* 后处理方法
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 跳转页面后执行
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2、配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--要拦截的具体方法-->
<mvc:mapping path="/user/*"/>
<!--不要拦截的方法-->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="lianbang.wu.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
SpringMVC的异常处理:
1、编写自定义异常类
public class SysException extends Exception {
private String message;
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
}
2、编写异常处理器
public class SysExceptionResolver implements HandlerExceptionResolver {
/**
* 处理异常的业务
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//获取异常对象
SysException exception = null;
if (e instanceof SysException){
exception= (SysException)e;
}else {
exception= new SysException("系统维护");
}
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg",exception.getMessage());
mv.setViewName("error");
return mv;
}
}
3、配置异常处理器
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="lianbang.wu.exception.SysExceptionResolver"></bean>
关于springMVC框架是什么样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4131739/blog/3083166