web-简单总结

1. MyBatis

  1. 说出你所了解的持久层(ORM)框架
  • mybatis,hibernate,jpa,jooq
  • object relationship mapping 建立java 对象与关系型数据库之间的映射关系
  • mybatis 是轻量级的 orm,hibernate 是重量级的(用注解方式建立orm关系,很多sql由框架生成)
  • jpa 是一套接口,hibernate 同时也作为 jpa

2)什么是 MVC,你的项目中哪里体现了 MVC

  • 模型(model) - 数据,domain,java bean
  • 视图(view) - 数据的展现方式,jsp
  • 控制器(controller) - 把模型和视图联系在一起,对应着 servlet

3)梳理一下 MyBatis 的使用步骤

  • pom.xml 中添加 mybatis 依赖
  • resources/mybatis-config.xml 配置文件(配置数据库连接和映射关系)
  • 提供 xml mapper 或 接口 映射 (都是通过这些映射管理 sql 语句)
  • 使用 mybatis 的api 执行增删改查

4)列举 MyBatis 中重要的接口,它们分别是干什么的?

  • SqlSessionFactory (接口) - 创建 sqlsession 的
  • SqlSessionFactoryBuilder (类) - 创建工厂对象
  • SqlSession (接口) - 执行增删改查,管理事务

5)列举 sqlSession 中重要的方法

  • 新增 - insert(“namespace + id”, sql参数对象)
  • 修改 - update(“namespace + id”, sql参数对象)
  • 删除 - delete(“namespace + id”, sql参数对象)
  • 查询一个列表 - selectList(“namespace + id”, sql参数对象)
  • 查询如果最多有一条 - selectOne(“namespace + id”, sql参数对象)
  • 事务 - rollback,commit
  • 获取mapper 接口 getMapper(接口.class)

6)xml mapper 中 parameterType 是干什么用的? resultType 呢?

  • parameterType sql语句的参数类型, int,string,学生对象,用户对象,list,map
  • resultType 是查询结果的类型

7)如果 parameterType 是个 map 如何获取值,list,javabean呢?

map.put("a", ..);
mpa.put("b", ..)
<select parameterType="map">
  select ... limit #{}, #{}
</select>
  • #{key} 利用key 获取map中的值
  • #{属性} 利用属性名,获取java bean中的属性值
  • <foreach collection="list" item="x">#{x}</foreach>

8)#{} 与 ${} 的区别

  • #{} 使用?占位符,相对安全,只能代替值
  • ${} 有注入攻击危险,直接拼接字符串,可以做简单运算,可以代替sql中的任意部分

9)resultType 和 resultMap 有啥区别,分别用在哪儿?

  • resultType 结果类型
  • resultMap 当列与属性不一致时,或者结果比较复杂不能用resultType直接映射时

10)如何查看 MyBatis 生成的 SQL 语句

  • 添加 logback 的依赖
  • 添加 resources/logback.xml 配置文件
  • <logger name="namespace+mapper文件名" level="debug">

11)如果要你使用 MyBatis 实现分页查询,用 xml mapper 如何实现? 用接口 mapper 呢

<select parameterType="map" resultType="">
    select * from user limit #{起始下标}, #{每页个数}
</select>
@Select("select * from user limit #{起始下标}, #{每页个数}")
public List<User> findPage(Map<String,Integer> map);

12)xml mapper 中的 namespace 是干嘛用的?
防止 xml mapper 中sql 语句的命名冲突

13)Mybatis 动态 sql 有哪几种,都用到哪些标签

<set> <where> <if test="条件"> <foreach collection="" item="" open="" close="" separator="">

14)Mybatis 中 xml mapper 中特殊字符如何处理,接口 mapper 呢?

  • 转义 < <
  • CDATA块 <![CDATA[ ]]>

15)接口 mapper 中如何向 sql 语句传参
sql 中还是可以使用 #{} 来获取参数值
如果有多个参数,一种方法可以传递一个map,其中可以包含多个参数

@Select(" #{名字}")
public void test(@Param("名字") int a, String b);

16)接口 mapper 中是否允许方法重名
不允许

17)接口 mapper 与 xml mapper 如何结合?

|- src
    |- main
        | - java
            | - mapper
                UserMapper.java
        | - resources
            | - mapper
                UserMapper.xml

在xml mapper 中 namespace=“mapper.UserMapper”
在xml mapper 中 sql语句的id 对应 接口mapper中的方法名

<mapper class="mapper.UserMapper">

18)如果列与属性不一致,有哪几种解决方法

  • 给列起一个列别名 , 列别名与属性一致
  • 使用 <resultMap>

19)Dept Emp 其中部门中有一个集合属性List emps 用 Mybatis 完成映射

public class Dept{

    private List<Emp> emps;
}

public class Emp {

}
<select ... resultMap="a">
    select a.*, b.* from dept a inner join emp b on a.deptno = b.deptno
</select>

<resultMap id="a" type="Dept">
    <id column="部门列名" property="部门属性名"/>
    <result column="部门列名" property="部门属性名"/>
    <collection property="emps" ofType="Emp">
        <id column="员工列名" property="员工属性名"/>
        <result column="员工列名" property="员工属性名"/>
    </collection>
</resultMap>

20)Mybatis中的缓存,你了解哪些

  • 一级, 每个sqlsession都有自己的一级缓存,sqlsession创建时创建,sqlsession关闭时销毁
  • 二级, 手动开启,多个sqlsession公用一个二级缓存,适用于读多写少

2. Ajax

1)Ajax用来解决什么问题?
ajax 也是向服务器发送请求的一种手段,但发送请求时不会导致页面刷新或跳转

2)Ajax底层的核心对象是?
var xhr = new XMLHttpRequest();
xhr.open(“get|post”, url, true|false);
xhr.send();
xhr.responseText

3)什么是异步请求?异步请求如何接收应答
xhr.send(); // 同步,异步
异步请求就是请求发送后,不必等待响应返回,接下来的代码可以继续执行

xhr.onload = function() {
xhr.responseText;
}

4)Ajax 的响应格式有哪些?

  • json
  • xml

5)Java 中你采用哪个库来处理 json,servlet 如何返回 json 格式的应答
jackson

ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString("java对象");

resp.setCharacterEncoding("utf-8");
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(json);

6)Javascript 中如何在 json 字符串和 js 对象之间转换

var js对象 = JSON.parse(json字符串);
var json字符串 = JSON.stringify(js对象);

7)说说 Ajax 的应用,你的项目中哪里用到了 Ajax

  • 评论弹幕
  • 图形验证码的验证
  • 省市县联动
  • 自动完成

3. Web

1)你知道的 web 服务器

  • tomcat, jetty
  • apache, nginx

2)Tomcat 如何安装,启动,停止,修改端口

  • 安装jdk,设置 java_home 环境变量,解压tomcat压缩包
  • 启动 bin\startup.bat
  • 停止 bin\shutdown.bat
  • conf\server.xml 在此文件中 <Connector port="8080">

3)Tomcat 中的应用程序通常部署在哪个目录下?

  • webapps

4)什么是 servlet,什么是 jsp,它们二者的关系是什么

  • jsp (java server pages) 服务器端页面
  • servlet 服务器端小程序
  • 都是java 服务器端生成动态内容的技术
  • jsp 本质仍然是 servlet, jsp 转译为一个*.java, 编译为*.class

5)说说 get 请求和 post 请求的区别

  • 请求参数有区别:get请求把请求参数跟在请求地址之后,post请求是把请求参数放入了请求体
  • get 请求长度有限,post 请求基本没有限制
  • doGet, doPost, service

6)常见的 jsp 指令有那几个

<%@ page contentType="text/html;charset=utf-8" %> 
<%@ taglib prefix="前缀" uri="标签库标识" %> 引入标签库
<%@ include file="另一个页面的地址" %> 包含另一个页面

7)web post 请求中为何有中文乱码问题,如何解决?

  • 发送请求时,浏览器会把中文内容编码(utf-8)后发送给服务器, 服务器默认使用英文字符集解码(iso-8859-1)
  • request.setCharacterEncoding(“utf-8”); // 设置解码的字符集

8)举出常见响应码的含义

  • 200 响应成功了
  • 404 请求的地址(页面)不存在
  • 500 java 服务器端有未捕获异常
  • 304 网页没有修改过, 就不必返回内容了
  • 403 没有权限
  • 400 请求参数有问题
  • 405 doGet或doPost没有实现
  • 302 请求重定向

9)如何进行请求转发,如何重定向,他俩的区别

request.getRequestDispatcher("路径").forward(request, response); // 请求转发

response.sendRedirect("路径"); // 请求重定向
  • 请求转发地址栏不会改变,底层仍是一次请求, 可以使用 request作用域传值

  • 请求重定向地址栏会改变,实际是两次请求, 只能使用 session作用域传值

  • servlet -》 jsp 关系非常紧密时(请求转发)

  • 两个独立功能(例如用户新增、用户列表) 他们之间跳转使用 请求重定向

10)作用域是干嘛用的,有那几个
用来存储数据,以便servlet,jsp页面来共享这些数据

  • page (仅限当前页面可以使用)
  • request (仅限同一次请求可以使用)
  • session (同一个浏览器的多次请求,一个会话)
  • application (同一个应用)

11)如何获取请求参数,与 request.getAttribute 有何区别

String 参数值 = request.getParameter("参数名");

request.getParameter 是获取请求参数的值,localhost:8080/ssss?username= 或是表单提交过来的

request.getAttribute 是获取 用  request.setAttribute() 存入作用域的值

12)说一说 servlet 生命周期

  • 当第一次向 servlet 发送请求时,会调用他的构造方法 (调用1次)
  • 紧接着调用 servlet 的init 初始化方法 (调用1次)
  • 接着调用 service 方法 (请求一次就调用一次)
  • 当服务停止会调用 servlet destroy 销毁方法 (调用1次)

13)EL 表达式是干嘛的

  • 从作用域中获取数据并展示
  • 还可以执行各种算数、逻辑运算

14)JSTL 是干嘛的,常见的标签有哪些
jsp 标准标签库,条件判断,循环控制,格式化输出等

<c:forEach items="${集合}" begin="" end="" var="临时变量名">

<c:if test="${条件判断}"></c:if>

<c:choose>
    <c:when test="${条件1}"> </c:when>
    <c:when test="${条件2}"> </c:when>
    <c:when test="${条件3}"> </c:when>
    ...
    <c:otherwise></c:otherwise>
</c:choose>

<c:out value="${值}"> 会照原样输出其中的html标签
<fmt:formatDate>
<fmt:formatNumber>

15)DO 是什么的缩写,DAO 呢

  • domain object 领域对象 (entity实体对象, javabean, pojo (plain old java object))
    他们的都是同一种java类不同称呼,都具有私有属性,get set方法,用来封装数据
  • data access object 数据访问对象

16)<%%> <%=%> <%!%> <%-- --%> <%@%> 的区别
<%%> jsp脚本,里面可以写java代码
<%=%> jsp表达式,可以用来输出内容
<%!%> jsp声明, 可以用来定义变量,此变量是类的成员变量(属性)
<%-- --%> jsp 注释
<%@%> jsp指令

17)jsp 中有哪些隐式对象

  • pageContext page作用域
  • request
  • session
  • application
  • response 响应对象
  • out 输出流对象
  • page this
  • config jsp配置
  • exception 异常对象

18)cookie 是干嘛用的
把一些信息以键值方式存储至浏览器中, 维系状态
Cookie c = new Cookie(key, value);
c.setMaxAge(10); // 寿命, 单位是秒
response.addCooke©;

19)session 是干嘛用的,与 cookie 的区别
把一些信息以键值方式存储至服务器端,维系状态
区别:

  • session 能存储任意类型, cookie 只能存储字符串
  • session 理论没有大小限制, 一个 cookie 大小约为 4k
  • 当两次请求间隔超过30分钟 session失效, cookie 会根据maxAge的值存活相应时间,如果没有设置maxAge浏览器关闭就会消失
  • session 相对安全

20)session 中如何存储对象,获取对象,删除对象,失效

HttpSession session = request.getSession();
session.setAttribute("名字",); // 存储

Object 值  = session.getAttribute("名字"); // 获取

session.removeAttribute("名字"); // 删除

session.invalidate(); // 主动失效

21)会话跟踪的原理

  • request.getSession(); // 首次请求,在服务器端创建出 session 对象, session会有一个id值(唯一的)
  • 第一次返回响应时,由tomcat 返回一个特殊cookie (jsessionid=session的id值) 返回给浏览器
  • 后续的请求,浏览器就根据这个 jsessionid的值找到服务器端的session对象

22)过滤器是干嘛用的,举几个应用场景

  • 请求到达目的地之前,首先会经过过滤器,过滤器中可以执行一些统一的操作
  • 统一设置字符编码
  • 统一执行权限检查
  • 统一执行登录检查
  • 自动登录过滤器

对应 设计模式中的 责任链模式

23)过滤器中有哪些匹配方式,如何放行请求
@WebFilter(urlPattern="")

  • 前缀匹配: /user/*
  • 后缀匹配: *.jsp
  • 精确匹配: /servlet1 跟目标路径一模一样

chain.doFilter(request, response);

4. 前端

1) js 中有没有块作用域?
for(var i = 0; i < … ;i ++) {

}
当循环结束 i 的值仍可以使用

// js let 声明的变量有块作用域

2) js 中如何表示数组和对象

  • 数组使用 [元素,元素…]
  • 对象使用 { “属性名”: 值 , … }

3) js 中数组排序有没有陷阱
有。

var array = [12,3,4,5];
array.sort(); // 将数组中的数字当做字符串来排序

array.sort( function(a, b){ return a - b } );

4) js 如何获取 html 元素

document.getElementById("id值"); // 返回一个标签
document.getElementsByTagName("标签名");  // 返回一个标签数组
document.querySelectorAll("选择器"); // #id, .class名 标签名 返回一个标签数组

<input id="id值">

5) js 如何改动标签的属性、内容、样式

标签.属性名="新的属性值";
标签.innerText = 内容 (当做普通文本)
标签.innerHTML = 内容 (当做html标签)
标签.style.样式名 = "值";
标签.className = "class值";

6) js 控制标签显示隐藏

标签.style.display = "none"; // 隐藏
标签.style.display = "block"; // 显示

7) js 创建标签,建立标签父子关系

var 标签对象 = document.createElement("标签名");
父标签.appendChild(子标签)

8) js 定时器如何创建

setTimeout( function(){}, n 毫秒值 ); // 当 n 毫秒后,执行函数的内容

9) 如何给标签添加事件,触发事件时 this 代表什么

标签.onclick = function(){};

<标签 onclick="函数名(this)">  this 代表触发事件的标签

5. maven

1)添加一个 maven 依赖通常要指定那三项,scope 是干嘛的

  • groupId - 公司或组织名
  • artifactId - 项目名
  • version - 版本
  • scope - 作用范围 test(测试阶段有效), provided(已提供)

2)maven 中默认 jdk 版本是什么,如何改变

  • 默认是 1.5
  • pom.xml中添加一个maven的编译插件来修改jdk的版本

3)如何将 maven 项目安装至本地仓库

  • 下载到项目源码
  • 执行 maven 的 install 命令安装至本地仓库

4)如何将 maven 项目打包

  • 执行 maven 的 package 命令 项目打包

6. 项目

1)rbac 是指什么
role based access control 基于角色的访问(权限)控制, 是软件开发中控制权限的一种设计思想

2)你们的数据库怎么设计的,有几张表,关系呢

  • 用户表
  • 角色表
  • 模块表
  • 用户和角色 多对多关系
  • 角色和模块 多对多关系
  • 模块表 自身一对多关系
  1. 你所做的模块都有哪些功能,说出其中一个的详细流程
    能够用语言把自己做过的模块表述出来

4)你的项目使用什么技术来访问数据库,重要的步骤

  • jdbc 执行效率高,项目规模不大
  • 加载驱动
  • 获取连接对象
  • 创建 sql 语句对象, Statement, PreparedStatement
  • 执行 sql , 通过 executeUpdate() executeQuery()
  • executeUpdate() 返回 int,代表影响行数
  • executeQuery() 返回 ResultSet, 结果集 while(rs.next())
  • 先打开的资源后关闭

5)PreparedStatement 用来解决什么问题

  • 采用预编译方法生成sql,并给sql语句的?占位符赋值,不容易发生sql注入攻击
  • 预编译sql 减少sql的编译次数,提升效率
  • select * from user where id = ?
  • select * from user where id = ?

6)如何使用 jdbc 控制事务

Connection conn = ...
conn.setAutoCommit(false); // 手动提交
try {
    // 多条sql
    conn.commit();
} catch (Exception e ) {
    conn.rollback();
}

7)jdbc 有哪些优化手段

  • 在查询时使用 where limit 返回部分结果
  • 连接池的技术,来减少连接的创建时间(每次没有真正关闭连接)
  • 使用批处理技术可以提升增删改的效率(减少了通信次数)
    • addBatch(); // 将sql加入批处理
    • executeBatch(); // 执行批处理中所有sql
  • 索引主要用来提高查询效率(已排序好的结果 B+树, 利用了空间换取了搜索时间)

8)你的项目中有没有使用单元测试,怎么做的
有,使用了JUnit单元测试
// junit 5

@Test // 执行入口
public void 方法名() {

    Assert.assertEquals(期望值, 实际值);
}

9)你的项目中使用的数据库是什么
mysql, oracle
默认端口:3306

-- 查看有哪些库
show databases;
use 库名;
-- 查看库中有哪些表
show tables;
-- 查看表结构
desc 表名

10)导入 sql 数据有什么方法,如果是纯文本数据呢

source sql文件的位置(gbk)
load data infile 文件位置

11)增删改查的 sql 语法

insert into 表名(列名...) values(...);
delete from 表名 where 条件;
update 表名 set 列名=... where 条件;
select 列名 from 表名 
    inner|left join 表名 on 连接条件 
    where 条件 
    group byhaving 条件
    order byasc|desc
    limit m, n;

12)sql 语句的执行顺序

连接 > where > group by > having > select > order by > limit

13)inner 和 left 的区别

  • inner 内连接, 满足连接条件的会出现在结果中
  • left 左连接,满足连接条件的会出现在结果中,除此以外左表中未满足连接条件的,也会出现在结果中

14)事务是什么,有哪些特性
把多条sql视为一个整体执行,要么都成功,要么都失败

  • 原子性
  • 一致性
  • 隔离性
  • 持久性
    ACID

15)你对 jdk8 的新特性了解多少
stream 流
lambda 表达式

list.stream().filter( i -> i % 2 == 0 ).collect(Collectors.toList());

jdk5 jdk8 jdk9

16)对反射知道什么
在运行期间可以获取对象的方法、构造器、属性、注解 …

Class c = …
c.newInstance();

Method m = …
// 对象.方法名(参数) 正常调用

方法对象.invoke(对象, 参数);

17)说说你了解的设计模式,以及他们的体现

  • 享元模式 - Integer (-128~127), 连接池
  • 原型模式 - 克隆 clone(实现 Cloneable 接口)
  • 单例模式 - Runtime 类
  • 迭代器 - 遍历集合 resultSet
  • 策略模式 - 不同的 Comparator 体现不同的策略
  • 过滤器 - 责任链模式
  • 建造器 - sqlSessionFactoryBuilder
  • 装饰 - new BufferedReader( FileReader ) 不是通过继承,通过组合方式扩展类的功能
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值