最后
金三银四到了,送上一个小福利!
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show(Map<String,Object> map)
{
map.put(“msg”,“你好”);
return “Success”;
}
}
model方式:
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show(Model model)
{
model.addAttribute(“msg”,“你好”);
return “Success”;
}
}
modelMap方式:
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show(ModelMap model)
{
model.addAttribute(“msg”,“你好”);
return “Success”;
}
}
index.jsp:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” isErrorPage=“true” %>
request域: ${requestScope.msg}
map,modelmap,model继承关系图
给这些参数里面保存的所有数据最终都会放在请求域中,可以在页面获取
Map,model,modelMap最终都是BindingAwareModelMap在工作,相当于给BindingAwareModelMap中保存的数据都会被放在请求域中
@RequestMapping(“/dhy”)
public ModelAndView test02()
{
//之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
//ModelAndView mv=new ModelAndView(“Success”);
ModelAndView mv=new ModelAndView();
mv.setViewName(“Success”);
mv.addObject(“msg”,“你好”);
return mv;
}
给session域中带数据。SpringMVC中提供了一种临时给Session域中保存数据的方式
使用一个注解@SessionAttributes(只能标注在类上)
//可以使用数组形式,key是msg,msg1,msg2的都会放入session域中
@SessionAttributes(value = {“msg”,“msg1”,“msg2”})
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show(HttpSession session, HttpServletRequest httpServlet)
{
session.setAttribute(“msg1”,“你好session”);
httpServlet.setAttribute(“msg2”,“你好erquest”);
return “Success”;
}
@RequestMapping(“/dhy”)
public ModelAndView test02()
{
//之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
//ModelAndView mv=new ModelAndView(“Success”);
ModelAndView mv=new ModelAndView();
mv.setViewName(“Success”);
mv.addObject(“msg”,“你好”);
return mv;
}
}
@SessionAttributes(types = {String.class,Integer.class})
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show(HttpSession session, HttpServletRequest httpServlet)
{
session.setAttribute(“msg1”,“你好session”);
httpServlet.setAttribute(“msg2”,“你好erquest”);
return “Success”;
}
@RequestMapping(“/dhy”)
public ModelAndView test02()
{
//之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
//ModelAndView mv=new ModelAndView(“Success”);
ModelAndView mv=new ModelAndView();
mv.setViewName(“Success”);
mv.addObject(“msg”,“你好”);
return mv;
}
}
后来推荐@SessionAttributes就别用了,可能会引发异常,给session中存放数据建议使用原生API
问题演示
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
价格:
@Controller
public class BookController {
@RequestMapping(“/book”)
public String ShowBook(Book book)
{
System.out.println(book);
return “Success”;
}
}
这里实际上是springMVC创建了一个Book对象,然后将对应的属性通过set方法赋值给该对象
如果我们要完成的操作是对数据库中保存的一条图书记录进行全更新,那么使用这种方法时,就会有问题
例如:我们在页面对图书进行修改时,无法修改图书的名字,因此new出来的Book对象的name值一定为null,如果把该对象放入数据库中,那么book的名字就会变成null,覆盖掉了原本图书的名字
解决方法----@ModelAttribute的使用方式之一
如果是使用从数据库中拿出来的准备好的对象来封装请求参数,那么如果请求参数中不包括对象的全部变量值,那么剩余变量的值就依旧采用数据库中拿出来的对象自身的值,这样就不会造成为null的现象
@Controller
public class BookController {
@RequestMapping(“/book”)
//告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
//即用我刚才从数据库中查找出来的book
public String ShowBook(@ModelAttribute(“book”) Book book)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
void BookFromDao(Map<String,Object> map)
{
//模拟从数据库查出来的book
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
map.put(“book”,book);
}
}
index.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
价格:
如果由springmvc来New一个新的book对象,那么这里的name就为null
自定义类型对象的赋值流程描述,以及@SessionAttributes注解可能引发的异常
给自定义类型赋值,主要在于attrName的值,首先会把attrName作为key值去隐含模型中寻找key==attrName的键,然后将key对应的值进行赋值
举例1:在给Book book对象赋值前,不加@ModelAttribute注解,那么会将参数类型首字母小写,即Book—>book,去隐含模型中寻找对应的key值
@Controller
public class BookController {
@RequestMapping(“/book”)
public String ShowBook(Book book,Map<String,Object> map)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
void BookFromDao(Map<String,Object> map)
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
map.put(“book”,book);//放入隐含模型中,key==book
}
}
举例2:通过@ModelAttribute(“haha”)来指定attrName的值
@Controller
public class BookController {
@RequestMapping(“/book”)
//告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
//即用我刚才从数据库中查找出来的book
public String ShowBook(@ModelAttribute(“haha”) Book book,Map<String,Object> map)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
void BookFromDao(Map<String,Object> map)
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
map.put(“haha”,book);//放入隐含模型中,key==haha
}
}
举例3:attrName=haha,隐含模型中只有key==book的值,那么会去session域中寻找,@SessionAttributes(value=“haha”),但是session中没有键为haha的值,这样会报异常
@SessionAttributes(“haha”)
@Controller
public class BookController {
@RequestMapping(“/book”)
//告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
//即用我刚才从数据库中查找出来的book
public String ShowBook(@ModelAttribute(“haha”) Book book,Map<String,Object> map)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
void BookFromDao(Map<String,Object> map)
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
map.put(“book”,book);//放入隐含模型中,key==haha
}
}
举例5:@ModelAttribute会把方法运行后的返回值也放入隐含模型中,key就是返回值类型小写
@Controller
public class BookController {
@RequestMapping(“/book”)
public String ShowBook(Book book)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
Book BookFromDao()
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
return book;
}
}
举例6:把返回值放入隐含模型,但是不使用默认的返回值小写作为key,而是自己指定
@Controller
public class BookController {
@RequestMapping(“/book”)
public String ShowBook(@ModelAttribute(“haha”) Book book)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute(“haha”)
Book BookFromDao()
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
return book;
}
}
举例7: 隐含模型中找不到对应的key,session中也找不到,那么会自动创建一个新对象
@Controller
public class BookController {
@RequestMapping(“/book”)
public String ShowBook(@ModelAttribute(“haha”) Book book)
{
System.out.println(book);
return “Success”;
}
@ModelAttribute
Book BookFromDao()
{
Book book=new Book(“大忽悠自传”,19);
System.out.println(“数据库中查到的图书信息:”+book);
return book;
}
}
@ModelAttribute的总结
@SessionAttributes的总结
第二点是如果隐含模型中没有,session中就必须有,不然抛出异常
==========================================================================
注意:forward转发到一个页面, /Fail.jsp转发到当前项目下的Fail.jsp. 一定要加上/,如果不加上/就是相对路径,容易出问题
forward前缀的转发,不会由我们配置的视图解析器进行拼串
@SessionAttributes(types = {String.class,Integer.class})
@Controller
public class userController {
@RequestMapping(“/hello”)
public String show()
{
return “forward:/Fail.jsp”;
}
}
Fail.jsp:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
Lose!!!
@Controller
public class userController {
@RequestMapping(“/hello01”)
public String show()
{
return “forward:/Fail.jsp”;
}
@RequestMapping(“/hello02”)
public String show1()
{
return “forward:/hello01”;
}
}
===============================================================================
@Controller
public class userController {
@RequestMapping(“/hello01”)
public String show()
{
return “redirect:/Fail.jsp”;
}
@RequestMapping(“/hello02”)
public String show1()
{
return “redirect:/hello01”;
}
}
注意:有前缀的转发和重定向操作,配置的视图解析器就不会进行拼串
视图解析器流程简单一句话总结原理:
1.导入jstl的依赖和standard的依赖
javax.servlet
jstl
1.2
taglibs
standard
1.1.2
最后
一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。
这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。
请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
)jstlView支持便捷的国际化功能—页面中英文切换
1.导入jstl的依赖和standard的依赖
javax.servlet
jstl
1.2
taglibs
standard
1.1.2
最后
一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。
这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。
[外链图片转存中…(img-95DXS9Va-1715326824037)]
请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析