最后
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
自定义类型对象的赋值流程描述,以及@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
2.导包如果导入了jstl,会自动创建一个jstlView,可以快速方便的支持国际化功能
也可以通过在springMVC.xml文件中配置,指定其创建jstlView
回顾javaweb国际化步骤
国际化资源文件的命名规范如下:
新建两个资源文件:i18n_cn_CN.properties 和 i18n_un_US.properties
title=First War Of The World
zhangHao=LoginNumber
password=Password
loginBtn=Submit
title=战地1
zhangHao=账号
password=密码
loginBtn=提交
在springmvc配置文件中加入bean
springMVC.xml:
<mvc:annotation-driven />
<context:component-scan base-package=“com.SpringMvc”/>
在jsp中加上标签以及替换相关需要使用的字符
login.jsp:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
<fmt:message key=“title”/>
<fmt:message key=“zhangHao”/>:
<fmt:message key=“password”/> :
index.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
国际化具体实现可以看下面这篇文章,链接在下面
.jsp页面一定要过SpringMVC的视图解析流程,才会创建一个jstlView来帮你快速国际化
不能写forward等前缀,因为代理前缀,创建的view不带国际化功能
只有默认创建的view才有支持国际化功能
SpringMVC.xml :
<mvc:view-controller path=“/toLoginPage” view-name=“login”/>
mvc:annotation-driven/
上面这段代码,可以替代上面的那个类完成的功能,但是还需要加上注解驱动模式,不然其他依赖注解完成请求映射调整的就不好使了
开启mvc注解驱动模式,需要导入mvc的命名空间
1.编写自定义的视图解析器和视图实现类
自定义视图解析器需要实现视图解析器接口和Order接口,Order接口是为了让自定义视图解析器先运行,否则会由默认视图解析器拦截,进行拼串
视图解析器类:
//自定义视图解析器
public class DhyViewResolver implements ViewResolver, Ordered {
private int order=0;
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
//根据视图名返回视图对象
if(viewName.startsWith(“dhy:”))
{
//返回我们的一个视图解析器对象
return new MyView();
}
else
{
//该视图解析器解析不了,就返回null,让下一个视图解析器尝试去解析
return null;
}
}
public int getOrder() {
return order;
}
//改变视图解析器的优先级
public void setOrder(int order) {
this.order = order;
}
}
视图实现类:
//自定义视图对象
public class MyView implements View {
//返回的内容数据类型
@Override
public String getContentType() {
return “text/html”;
}
@Override
public void render(Map<String, ?> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
System.out.println(“之前保存的数据:”+map);
//设置响应的内容类型
httpServletResponse.setContentType(“text/html”);
List video = (List) map.get(“video”);
for(String s:video)
{
httpServletResponse.getWriter().write(s+“
”);
}
List img = (List) map.get(“img”);
for(String s:img)
{
httpServletResponse.getWriter().write(s+“
”);
}
httpServletResponse.getWriter().write(“
精彩内容马上上映…
”);
}
}
2.视图解析器必须放置IOC容器中
3.测试类
MyViewResovlerController类:
/自定义视图解析器和视图对象/
@Controller
public class MyViewResovlerController
{
@RequestMapping(“/handle”)
public String handle(Model model)
{
List VName = new ArrayList<>();
List imgName = new ArrayList<>();
VName.add(“大忽悠”);
VName.add(“小朋友”);
imgName.add(“大忽悠和小朋友”);
model.addAttribute(“video”,VName);
model.addAttribute(“img”,imgName);
//以dhy:前缀访问的才能跳转到picture页面
return “dhy:/WEB-INF/pages/picture.jsp”;
}
}
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
odel)
{
List VName = new ArrayList<>();
List imgName = new ArrayList<>();
VName.add(“大忽悠”);
VName.add(“小朋友”);
imgName.add(“大忽悠和小朋友”);
model.addAttribute(“video”,VName);
model.addAttribute(“img”,imgName);
//以dhy:前缀访问的才能跳转到picture页面
return “dhy:/WEB-INF/pages/picture.jsp”;
}
}
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
[外链图片转存中…(img-JI5DTmgq-1715009629602)]
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
[外链图片转存中…(img-McPODBVZ-1715009629602)]
[外链图片转存中…(img-enzPS1Qk-1715009629602)]