1. 转发和重定向的区别?
1、重定向是浏览器发送请求并受到响应以后再次向一个新地址发请求;转发是服务器受到请求后为了完成响应转到一个新的地址。
2、重定向中有两次请求对象,不共享数据;转发只产生一次请求对象且在组件间共享数据。
3、重定向后地址栏地址改变;而转发则不会。
4、重定向的新地址可以是任意地址;转发的新地址必须是同一个应用内的某地址。
2. 什么是Cookie和Session?服务器时如何实现状态管理的?
(1)什么是Cookie
Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据。
首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。
当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。
Cookie就是服务器保存在客户端的数据!
Cookie就是一个键值对
(2)什么是Session
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
(3)如何实现状态管理:
session是依赖Cookie实现的。session是服务器端对象
当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,并创建一个Cookie,在Cookie中保存了session的id,发送给客户端。这样客户端就有了自己session的id了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId。
当用户第二次访问服务器时,会在请求中把保存了sessionId的Cookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。
当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。
3. JSP中有哪些内置对象?JSP和Servlet的区别
JSP中有九大内置对象:request response session application config exception out pageContext page
Jsp和Servlet的相同点:
Jsp是在Servlet基础上推出的,即Jsp从本质上来讲是Servlet,所以Jsp具有Servlet的功能,也就理所当然支持Java语句了。
Jsp和Servlet的不同点:
(1)Jsp和Servlet两者创建的方式不一样
(2)两者都可以形成Html页面,但是Jsp更直观、方便,因为它可以直接用HTML标签和Javascript;而Servlet是采用CGI的方式一句一句输出HTML语言标签的,和JSP相比就显得的笨拙了。
(3)现在流行MVC模式,所以都是用Servlet控制业务流程,及Control层,JSP实现View层。
4. 常见的JSTL标签有哪些,并说明用途
set out remove if choose foreach url 详见《JSP技术的使用——好像过时了唉。。。。。》
5. 请简述你对MVC的理解?
Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入(写入数据库记录)。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。
例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
6. 实现分页主要有哪些属性?
pageNum 当前页面
pageSize 页大小
totalSize 总数据个数
pageCount 总页数
data 当前分页数据
7. 在mybatis的映射文件中,#{}和${}的区别
(1)#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它任意名称。
(2)${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
8. parameterType和resultType
parameterType:指定输入参数类型,MyBatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,MyBatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
9. Maven有哪些优点和缺点?
优点如下:
- 简化了项目依赖管理
- 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作
- 便于与持续集成工具(jenkins)整合
- 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
- 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
- maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点如下:
- maven是一个庞大的构建系统,学习难度大
- maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
- 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
- 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
10. Maven依赖范围有哪些?
依赖范围 | 编译 | 测试 | 运行 | 打包(war) | 例子 |
---|---|---|---|---|---|
compile | yes | yes | yes | yes | beanutils、fileupload |
test | no | yes | no | no | junit |
provided | yes | yes | no | no | serlvet-api、jsp-api |
runtime | no | yes | yes | yes | jdbc驱动 |
system | yes | yes | no | no | 本地jar包。maven仓库之外的jar包 |
11. MyBatis中#和$符号的区别?
- #是预编译处理,一般用于数据处理;$是字符串替换,一般用于sql语句字段处理
- MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用preparedStatement的set方法来赋值
- MyBatis处理${}时,就是将其作为字符串,拼接到sql语句
- 使用#{}可以有效防止sql注入,提高系统安全性
12. MyBatis中如何传递多个参数?
- 顺序传参法
#{}里面的数字代表你传入参数的顺序,一般使用param1,param2…赋值 - @Param注解传参法
在接口的参数列表中使用注解,#{}里面的名称对应的是注解 @Param括号里面修饰的名称 - map传参法
#{}里面的名称对应的是 Map里面的key名称 - Java Bean传参法
#{}里面的名称对应的是 User类里面的成员属性
13. Mybatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis 动态 SQL ,可以让我们在 XML 映射文件内,以 XML 标签的形 式编写动态 SQL ,完成逻辑判断和动态拼接 SQL 的功能。
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支 |
choose(when, otherwise) | 相当于java的switch-case | 多条件分支 |
trim(where, set) | 辅助元素 | 用于处理sql拼接问题,trim先去除空格 |
foreach | 循环语句 | 批量更新、插入、查询 |
bind | 创建一个变量并绑定到上下文 | 用于兼容不同数据库,防止sql注入 |
其执行原理为,使用 OGNL 的表达式,从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL ,以此来完成动态 SQL 的功能。