赞
踩
路由查询字符串(我用的)
// 路由定义 { path: '/article', component: article } // 跳转并传参 viewDetails(row) { //现将参数存储 let id = row.id; let title =row.title this.$router.push( { //添加需要传值到那个页面的路径 path:'/article', //携带需要传递的参数 query:{ id:id, title:title, } }) } // 获取参数 loadArticleList() { //接受上级页面传来的id参数 let id = this.$route.query.id; console.log(this.$route) console.log("文章id:"+id) }
通过事件传值:通过$emit
触发事件并传值,在目标组件通过$on
监听接收。
// 传值页
this.$emit('sendMsg', 'some value')
// 目标页
mounted() {
this.$on('sendMsg', (value) => {
// do something
})
}
props
向子组件传递数据。// 父组件
<ChildComponent message="some data" />
// 子组件
props: ['message']
子组件可以通过this.message
访问props
传递过来的数据。
// 子组件
this.$emit('sendMsg', 'some value')
// 父组件
<ChildComponent v-on:sendMsg="getMsg"/>
methods: {
getMsg(value) {
// ...
}
}
一般来说,获取信息使用GET,创建和更新使用POST或PUT,删除使用DELETE。POST和PUT的选择依据是是否完全替换资源
用户发送请求到前端控制器(DispatcherSetvlet),
前端控制器将读取url查找匹配的hander对象传到处理器映射器(handlerMapping) ,并返回handler对象给前端控制器(DispatcherSetvlet)
前端控制器(DispatcherSetvlet)调用处理器适配器,
适配器确定处理业务(Controller)
Controller调用指定的service处理
处理完成后返回modeandview对象(json格式)给前端控制器
前端控制器(DispatcherSetvlet)调用视图解析器进行解析
视图解析器解析完成后返回view视图
将视图传递给前端显示
在MVC架构中,事务属于Model层。
MVC分三层:
View: 用于展示数据,界面层。
Controller: 用于接收用户输入和处理用户请求,控制层。
Model: 用于业务逻辑和数据处理,模型层。
@Component:这是Spring中最基本的bean注册方式,它会自动将标识了@Component的类注册为Spring bean。
我们可以使用@Component的衍生注解来进一步定义bean的类型,如:
@Bean:这是@Configuration配置类中的方法级别的注解,用于直接注册一个bean。
是的,工厂设计模式是一种常用的设计模式。工厂设计模式有以下几个角色:
举个简单的例子:
简单工厂模式:
public class CarFactory {
public Car createCar(String type) {
if ("汽车".equals(type)) {
return new Car();
} else if ("电动车".equals(type)) {
return new ElectricCar();
}
}
}
工厂方法模式:
public interface CarFactory {
Car createCar();
}
public class CarFactoryImpl1 implements CarFactory {
public Car createCar() {
return new Car();
}
}
public class CarFactoryImpl2 implements CarFactory {
public Car createCar() {
return new ElectricCar();
}
}
使用工厂设计模式的主要优点是解耦,使客户端和具体产品之间的依赖关系解耦,客户端不再需要知道如何去创建具体的产品对象。
ServletContext
初始化时创建一个新的bean实例,该作用域仅在WebApplicationContext环境下有效。通常会创建两个SqlSessionFactory:
SqlSessionFactory#openSession()
方法获得。SqlSessionFactory#openSession(true)
方法获得,参数 true 表示自动提交事务。SqlSessionFactory#openSession()
方法获得。 SqlSessionFactory#openSession(ExecutorType, boolean)
方法获得,根据 ExecutorType 的种类来决定生命周期的长短。java
Map<String, Integer> map = new HashMap<>();
for (String key : map.keySet()) {
Integer value = map.get(key);
// do something
}
java
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
// do something
}
java
map.forEach((key, value) -> {
// do something
});
有,在前端用户点击提交时间,会将密码进行加密传输到后端
// 前端加密
let pwd = '123456';
let encryptPwd = md5(pwd); // md5 哈希
// 发送 encryptPwd 到后端
// 后端解密
let decryptPwd = md5('123456');
if (encryptPwd === decryptPwd) {
// 密码验证成功
}
缺点是如果加密算法泄露,就失去意义。
// 前端使用 AES 和密钥加密
let pwd = '123456';
let key = 'secret key';
let encryptPwd = AES.encrypt(pwd, key);
// 发送 encryptPwd 到后端
// 后端使用 RSA 私钥解密 AES 密文
let decryptPwd = RSA.decrypt(encryptPwd, privateKey);
if (decryptPwd === '123456') {
// 密码验证成功
}
这种方式较为安全,但前端需要管理好密钥。
过滤器和拦截器都是AOP(面向切面编程)中的重要概念。
但它们之间有一定的区别:
过滤器(Filter):
拦截器(Interceptor):
所以总体来说,过滤器的功能更广,拦截器更加强大,主要是因为拦截器可以访问控制器上下文等WEB框架的上下文信息。
在Spring中,拦截器可以通过两种方式注册:
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**");
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.myweb.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
另外,拦截器的执行顺序是由其注册的顺序决定的,注册在前的拦截器会先被执行。
拦截器方法主要有三个:- preHandle:controller方法执行前调用,若返回false,则不执行controller方法。
以上的面试均为真实面试经历,解答为个人立即以及整合ChatGPT的答案,如有不正确的,或者不足的欢迎补充~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。