发布于2021-03-13 18:32 阅读(1299) 评论(0) 点赞(13) 收藏(4)
M 模型(Model):模型就是数据,就是 dao,bean
V 视图(View):网页, JSP,用来展示模型中的数据
C控制器(controller):把不同的数据(Model),显示在不同的视图(View)上
springMVC框架的作用:接收页面提交的数据、向视图发送数据
<!--扫描Controller注解-->
<context:component-scan base-package="com.jiale.controller"/>
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
解析:
扫描注解:会寻找有@controller注解的类中的的@RequestMapping注解,将方法名的全名称作为一个value,放入到handler映射中
配置处理器映射器和适配器可以省略
视图解析器:将逻辑视图转换为真正的视图,得到真正的视图地址/WEB-INF/XXX.jsp
<!--配置前端控制器-->
<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>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果不配置springMVC的核心配置文件的地址,就会在WEB-INF文件夹下找前端控制器名称XXXXX-servlet.xml作为配置文件拦截路径
handler:
@RequestMapping("/demo01.do")
public String demo01(int id,String name,double money,boolean start){
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println(start);
//返回逻辑视图
return "main";
}
执行后在浏览器中输入http://localhost:8080/springMVCtest/demo01.do?id=2李四&money=90&start=true
若后台输出的是乱码,则我们需要在tomcat的设置中的VM options添加-Dfile.encoding=UTF-8
若控制台乱码,则在help选项上面添加Edit Custom VM Options
在后台会打印数值 2 李四 90.0 true,然后跳转到/WEB-INF/main.jsp上
创建一个User实体类
控制层:
//测试接收对象作为传递的参数
@RequestMapping("/demo02.do")
public String demo02(User user){
System.out.println(user);
//返回逻辑视图
return "main";
}
后台显示:User{id=2, name=‘李四’, money=90.0, start=true}
在webapp下面创建一个index01.html文件,文件里面添加多选
<form action="demo03.do" method="get">
<input type="checkbox" name="hobby" value="eat">吃
<input type="checkbox" name="hobby" value="drink">喝
<input type="checkbox" name="hobby" value="play">玩
<input type="checkbox" name="hobby" value="enjoy">乐
<br>
<input type="submit" value="提交">
</form>
handler:
//测试多选提交的数据
@RequestMapping("/demo03.do")
public String demo03(String hobby){
System.out.println(hobby);
//返回逻辑视图
return "main";
}
创建一个Dog对象
private User user
控制层:
//测试前台传递dog和user对象
@RequestMapping("/demo04.do")
public String demo04(Dog dog,User user){
System.out.println(dog);
System.out.println(user);
return "main";
}
在webapp下面创建一个index02.html文件
<form action="demo04.do" method="get">
狗的id<input type="text" name="id" ><br>
狗的名称<input type="text" name="dname" ><br>
狗主人的id<input type="text" name="user.id" ><br>
狗主人的名称<input type="text" name="user.name" ><br>
狗主人的身价<input type="text" name="user.money" ><br>
<br>
<input type="submit" value="提交">
</form>
User类下添加属性:
private Integer[] array;
private List<Dog> dogs;
handler同简单对象的绑定
在webapp下面创建一个index03.html文件
<form action="demo02.do" method="get">
人的id <input type="text" name="id"><br>
人的名字<input type="text" name="name"><br>
人的钱<input type="text" name="money"><br>
人的状态<input type="radio" name="start" value="true">启用
<input type="radio" name="start" value="false">禁止<br>
幸运号码:
<input type="checkbox" name="array" value="1">1
<input type="checkbox" name="array" value="2">2
<input type="checkbox" name="array" value="3">3
人养的狗:<br>
第一个狗的名称<input type="text" name="dogs[0].dname"><br>
第二个狗的名称<input type="text" name="dogs[1].dname"><br>
第三个狗的名称<input type="text" name="dogs[2].dname"><br>
<br>
<input type="submit" value="提交">
</form>
User类下添加属性:
private Map<String,Dog> maps;
handler同上:
在webapp下面创建一个index04.html文件
<form action="demo02.do" method="get">
人的id<input type="text" name="id" ><br>
人的名称<input type="text" name="name" ><br>
人的身价<input type="text" name="money" ><br>
人的状态<input type="radio" name="start" value="true" >启用
<input type="radio" name="start" value="false" >禁用<br>
人养的狗:<br>
第一个狗的名称<input type="text" name="maps['dog1'].dname"><br>
第二个狗的名称<input type="text" name="maps['小狗狗'].dname"><br>
第三个狗的名称<input type="text" name="maps['狗儿子'].dname"><br>
<br>
<input type="submit" value="提交">
</form>
要添加javax.servlet-api依赖
handler:
//数据发送 使用原生态的servletAPI
@RequestMapping("/demo06.do")
public String demo06(HttpServletRequest request,HttpServletResponse response, HttpSession session){
//request域对象放入参数
request.setAttribute("message","我是request域对象的参数");
//session中放入参数
session.setAttribute("session","我是session中的参数");
//跳转页面
return "success";
}
在WEB-INF下面创建一个success.jsp文件
<body>
<h1>读取后台发送的参数</h1>
request:${message}<br>
session:${session}
</body>
在handler入参中添加map 相当于在request域对象中添加参数
@RequestMapping("/demo06.do")
public String demo06(Map<String,Object> map){
//map中放入数据
map.put("message","我是map中存放的数据")
return "success";
}
@RequestMapping("/demo07.do")
public String demo07(Model model){
model.addAttribute("message","我是model传递的参数");
return "success";
}
@RequestMapping("/demo08.do")
public String demo08(ModelMap modelMap){
modelMap.addAttribute("message","使用model传递的参数");
modelMap.put("session","使用map的方法传递的数据");
return "success";
}
使用ModelAndView传递数据,是将ModelAndView作为一个返回值使用
@RequestMapping("/demo09.do")
public ModelAndView demo09(){
//创建一个ModelAndView对象
ModelAndView mav = new ModelAndView();
//设置逻辑视图
mav.setViewName("success");
//放入参数
mav.addObject("mession","ModelAndView传递的参数");
//返回结果
return mav;
}
用字符串返回作为返回值,返回的就是逻辑视图
return "success";
返回的success会根据视图解析器前缀加后缀,组合为一个真正的视图返回,使用视图解析器将会返回的页面限定在同一目录下,不能出目录,也不能重定向
springMVC在返回的时候view视图支持重定向和转发到其他地方,在返回字符串的时候添加关键字来解决
return "forward:index.jsp";
重定向:
//重定向页码
return "redirect:http://www.baidu.com/s";
可以使用servlet原生态的API来实现转发或者重定向
@RequestMapping("/demo10.do")
public void demo10(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//转发
request.getRequestDispatcher("index01.html").forward(request, response);
//重定向
response.sendRedirect("http://www.baidu.com");
}
也可以返回json数据
@RequestMapping("/demo11.do")
public void demo11(HttpServletRequest request,HttpServletResponse response) throws IOException {
//创建一个json数据
String json = "{\"name\":\"张三\",\"age\"\":12}";
//将json返回
response.getWriter().write(json);
}
返回值是ModelAndView对象
代码同使用ModelAndView传递数据
为该方法提供一个uri的访问路径,可省略前面的/和后缀
@RequestMapping(value = "demo01")
value可添加多个uri地址,两个地址都可以访问到对应的handler
@RequestMapping(value = {"/demo01.do","/demo02.do"})
设置访问权限
//当前的方法只能使用post来访问
@RequestMapping(value = "/demo01.do",method = RequestMethod.POST)
可以添加属性params 来限制访问请求的参数
//限定提交的数据必须有name参数
@RequestMapping(value = "/demo01.do",params="name")
name 必须有name参数
!name 参数中必须不能有name参数
name=zsan 必须有name参数并且参数值必须是zsan
name!=zsan name参数可有可无 但是如果有值不能是zsan
是为当前类下所有的handler的uri添加前缀,为了防止uri的重复
//在类上
//该类下所有的handler的uri前面都添加demo01,访问路径/项目名称/demo/demo01.do
@RequestMapping(value = "/demo")
//在方法上
@RequestMapping(value = "/demo01")
该注解写在形参列表中的,里面有两个属性常用
@RequestMapping("/demo02.do")
//将表单提交的names数据转化为name数据
public String demo02(@RequestParam(value = "names") String name){
System.out.println(name);
return "main";
}
@RequestMapping("/demo02.do")
//如果name没有数据,默认就是张三
public String demo02(@RequestParam(defaultValue = "张三") String name){
System.out.println(name);
return "main";
}
如果要使用该注解,必须要额外导入jackson-databind依赖
在handler类上添加注解,就会将返回的对象转化为一个json对象
必须在拦截路径是/的时候来使用,使用rest风格的时候来使用。rest风格传参的时候很多都是将参数放在url路径中
/demo03/add/zsan/22/nan/dalq
使用url传递参数的时候 才使用该注解
//使用路径传递参数
@RequestMapping("/add/{name}/{age}/{sex}")
public String demo(@PathVariable("name") String name,
@PathVariable("age") String age,
@PathVariable("sex") String sex){
System.out.println(name);
System.out.println(age);
System.out.println(sex);
return "main/main";
}
为了解决post乱码,springMVC自己做了过滤器,一般使用该过滤器就能解决所有post乱码问题:在web.xml添加配置:
<!--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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
若前端控制器拦截路径是/ 或者/* 会拦截静态资源的(css、js、图片、html网页)都会被拦截,如果需要在springMVC中分开静态资源,必须在核心配置文件中添加一个配置:
<!--静态资源放行-->
<mvc:default-servlet-handler/>
异常处理机制是指我们在springMVC项目中所有的异常都交给统一的异常处理耐进行项目如果上线了,让用户有更好的体验,一般在项目开发阶段不会使用。
如果要使用需要创建一个统一的异常处理类:
public class MyException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
//将错误处理分为两个部分
//可以数据object 发生错误的地方和 exception 对应的异常来决定怎么做
//不重要的异常 不重要的代码块 可以直接写日志就行
//比较重要的异常 和代码块 可以发送邮件 提醒运维人员处理
//紧急的错误 需要立即处理的 可以发短信、电话等等方式通知运维人员
//在用户看来 为了提升用户体验 可以跳转到一个友好的界面
ModelAndView mav = new ModelAndView();
mav.setViewName("main/main");
mav.addObject("message","不好意思!请重试");
return mav;
}
}
核心配置文件中添加:
<!--添加统一异常处理类-->
<bean class="com.offcn.utils.MyException"/>
原文链接:https://blog.csdn.net/ilvjiale/article/details/114639294
作者:大哥你来啦
链接:http://www.qianduanheidong.com/blog/article/35724/a8c495259c4404e09d76/
来源:前端黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 前端黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-3
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!