Javaweb面试题整理

Tomcat

  1. 怎么手工部署项目到 tomcat?

找到tomcat目录的webapps
直接将项目放到webapps目录下即可,比如我创建了hello文件夹
在这里插入图片描述

hello文件夹中有hello.html文件
我们让tomcat启动,在浏览器中输入网址即可看到html文件中的内容

http://localhost:8080/hello/hello.html

在这里插入图片描述

项目的访问路径:hello。又叫做虚拟路径

上述例子中,hello中只有一个html文件
如果你的文件在别的文件夹中写好了,而且比较大,可以使用 简化部署 的方式:

首先将你的文件夹解压成war形式,当然要使用专门的解压工具解压成war。如果没有的话,可以解压成zip然后修改后缀名。

将war文件复制到webapps目录下,在tomcat开启的情况下,会自动解压war文件。删除时,解压的文件也会自动删除。
之后就可以在浏览器访问了。

  1. tomcat 默认的端口号是多少?
8088
  1. web应用的启动文件是什么?
startup.bat

Servlet

Servelet基础

  1. Servlet 在哪个文件中进行配置?

web.xml文件

  1. 如何配置 Servlet ?

两种方式

<servlet>
    <servlet-name>Action</servlet-name>
    <servlet-class>com.demo.servlet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Action</servlet-name>
    <url-pattern>/action</url-pattern>
</servlet-mapping>
@WebServlet(name = "UserServlet",urlPatterns = "/UserServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,            IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,             IOException {}

  1. 在 J2EE 中属于 Web 层的组件有。(A)
    A.Servlet B.EJB C.Applet D.HTML
  2. 下面哪一个标记与 Servlet 的配置无关(D)
    A.servlet-mapping B.servlet-class C.url-pattern D.tag
  3. 在 Servlet 处理请求的方式为。(C)
    A.以进程的方式 B.以程序的方式 C.以线程的方式 D.以响应的方式
  4. 假设网站的 IP 地址为 1.2.3.4,端口 8878,应用的名字 helloApp,servlet 的访问方式/hello,现在要访问这个
    servlet,如何访问?
http://1.2.3.4:8878/helloApp/hello
  1. Servlet 是一个在服务器上运行、处理请求信息并将其发送到客户端的 Java 程序。()接受服务请求、找到
    Servlet 类、加载 Servlet 类并创建 Servlet 对象。(C
    A.客户端 B.IE 浏览器 C.Servlet 容器 D.Servlet 本身

http

  1. HTTP 协议的全称是()。(A
    A.Hypertext Transport Protocol B.Hyper text Transport Protocol
    C.Hypertext Transfer Protocol D.Hyper text Transfer Protocol
  2. 在 JavaEE 中,HttpServletRequest 对象是由()创建的。(A
    A.由 Servlet 容器负责创建,对于每个 HTTP 请求,Servlet 容器都会创建一个 HttpServletRequest 对象
    B.由 JavaWeb 应用的 Servlet 或 JSP 组件负责创建,当 Servlet 或 JSP 组件响应 HTTP 请求时,先创建
    HttpServletRequest 对象
    C.由程序员通过编码形式创建,以传递请求数据
    D.以上都不对
  3. HttpServlet 中,用来处理 GET 请求的方法是。(B)
    A.doHead B.doGet C.doPost D.doPut
  4. 在 Servlet 中,下列语句可以正确获取 PrintWriter 对象的是(C)。
    A.PrintWriter out = request.getWriter();
    B.PrintWriter out = request.getPrintWriter();
    C.PrintWriter out = response.getWriter();
    D.PrintWriter out = response.getPrintWriter();
  5. 对于 ServletRequest 接口的获取请求参数的方法的描述那一项是正确的?(C
    A)getParameter 方法只用于接收 POST 请求参数,接收 GET 请求参数需要使用 getQueryString 方法
    B)如果一个参数 key 有多个值,那么 getParameter(key)方法会返回空
    C)如果一个参数 key 有多个值,那么 getParameterValues(key)方法会返回一个包含所有值的字符串数组
    D)getParameter 方法返回 Object 对象,使用前要强制类型转换:如 String str=(String) request.getParameter(key)

客户端跳转

  1. 下面有关 forward 的 redirect 描述,正确的是( ABCD)
    A.forward 是服务器将控制权转交给另一个内部服务器对象,由新的对象来全权负责响应用户的请求
    B.执行 forward 时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址
    C.执行 redirect 时,服务器端告诉浏览器重新请求地址
    D.forward 是内部重定向,redirect 是外部重定向
    E.redirect 默认将产生 301Permanently moved 的 HTTP 响应

  2. 阅读下面代码片段:
    RequestDispatcher dispatcher=request.getRequestDispatcher(“a.jsp”);
    dispatcher.forward(request,response);
    关于该段代码的作用,下列叙述哪项是正确的?(B
    A)页面重定向到 a.jsp 页面 B)将请求转发到 a.jsp 页面
    C)从 a.jsp 定向到当前页面 D)从 a.jsp 转发到当前页面

cookie和session

  1. 在 servlet 的 doGet 方法,下面哪几个说法是错误的(BCD
    a.redirect 到一个 jsp 页面时,之前 doGet 放在 request 中的对象都会丢失
    b.redirect 到一个 jsp 页面时,之前 doGet 放在 session 中的对象都会丢失
    c.forward 到一个 jsp 页面时,之前 doGet 放在 request 中的对象都会丢失
    d.forward 到一个 jsp 页面时,之前 doGet 放在 session 中的对象都会丢失
  2. 在 J2EE 中,对于在 Servlet 如何获得会话,描述正确的是()。(AC
    A.HttpServletRequest 类的 getSession 方法有两个:带参数的 getSession 方法和不带参数的 getSession 方法
    B.在 servlet 中,可以使用 HttpSession session =new HttpSession()创建 session 对象
    C.如果 HttpServletRequest 类的 getSession 方法的参数为 false,表示如果没有与当前的请求相联系的会话对
    象时,该方法返回 null
    D.如果 HttpServletRequest 类的 getSession 方法的参数为 true,表示如果没有与当前的请求相联系的会话对
    象时,该方法返回 null
  3. MVC 设计模式包含模型层、视图层和控制器层,在下列组件中扮演控制器角色的是()。(A
    A.Servlet B.JSP C.JavaBean D.HTML
  4. j2EE 中( A)类的( )方法用于创建对话。选择一项
    a)HttpServletRequest、getSession
    b)HttpServletResponse、newSession
    c)HtttpSession、newInstance
    d)HttpSession、getSession
  5. 以下哪个对象提供了访问和放置页面中共享数据的方式( D
    A)pageContext B)response C)request D)session
  6. 当 response 的状态行代码为哪个时,表示用户请求的资源不可用?(D
    A)101 B)202 C)303 D)404
  7. 能够替代<字符的替代字符是(A )?
    A)&lt B)> C)< D) 

maven

Maven 常用命令有哪些,至少写出 3 个?

命令描述
mvn clean对项目进行清理,删除target目录下编译的内容
mvn compile编译项目源代码
mvn test对项目进行运行测试
mvn package打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件
mvn install在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target

Spring

基础

  1. Spring 框架有哪些主要模块?

Spring 框架至今已集成了 20 多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、
Web、AOP(面向切面编程)、工具、消息和测试模块。

  1. 以你的经验来看,为什么要选择使用 Spring 框架呢?
  • Spring 采用层次结构,有超过 20 个模块可供选用。这就意味着你可以根据需要自由取舍
  • Spring 框架的核心功能是依赖注入(DI)
  • Spring 支持面向切面编程(Aspect Oriented Programming ,AOP),允许通过分离应用业务逻辑和系统服务从而进行内聚性的开发。
  1. 什么是 spring?
  • 一个容器框架
  • 一个轻量级框架
  • 用于管理 MVC 框架的全部的组件

关联注入及接口编程

  1. 关于依赖注入说法正确的是(A
    A.依赖注入的目标是在代码之外管理程序组之间的依赖关系
    B.依赖注入即是“面向接口”的编程
    C.依赖注入是面向对象技术的替代品
    D.依赖注入的使用会增大程序的规模

  2. 下列说法错误的是:(A
    A.Spring 的 BeanFactory 只能产生一个新的实例
    B.Spring 的 BeanFactory 可以产生一个的实例
    C.Spring 的 BeanFactory 可以产生两个的实例
    D.Spring 的 BeanFactory 可以产生多个的实例

  3. 下列关于 Spring 特性中 IoC 描述错误的是:( A
    A .IoC 就是指程序之间的关系由程序代码直接操控。
    B .所谓“控制反转”,是指控制权由应用代码转到外部容器,控制权的转移,
    C.IoC 将控制创建的职责搬进了框架中;并把它从应用代码脱离开来
    D .当使用 Spring 的 IoC 容器时只需指出组件需要的对象,在运行时 Spring 的 IoC 容器会根据 XML配置数据提供给它。

  4. 下面选项哪个不是 Spring 中接口注入的方式?( D
    A .接口注入 B .构造方法注入 C .设值注入 D .指针注入

  5. 解释 Spring 支持的几种 bean 的作用域。

    • singleton:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个
      bean 的实例,单例的模式由 bean factory 自身来维护。
    • prototype:原形范围与单例范围相反,为每一个 bean 请求提供一个实例。
    • request:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,
      bean 会失效并被垃圾回收器回收。
    • Session:与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean 会
      随之失效。
  6. Spring 框架中的单例 bean 是线程安全的吗?

    Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并发问题需要开发者自行去搞定。
    但实际上,大部分的 Spring bean 并没有可变的状态(比如 Serview 类和 DAO 类),所以在某种程度上说 Spring 的单例 bean 是线程安全的。
    如果你的 bean 有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
    最浅显的解决办法就是将多态 bean 的作用域由“singleton”变更为“prototype”。

  7. 解释一下 Dependency injection(DI,依赖注入)?

    依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实
    例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的
    基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?

  8. 描述一下 Spring 中实现 DI(Dependency Injection)的几种方式

    依赖注入有三种类型:

    • 构造方法注入(例如,Spring 框架):依赖是通过构造器参数提供的。
    • 设值方法注入(例如,Spring 框架):依赖是通过 JavaBeans 属性注入的(geter:setter 方法)
    • 接口注入(例如,Avalon):注入通过接口完成。
  9. 简述你对 IoC(Inversion of Control)的理解

    控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效
    的作用。
    
  10. 下面有关 spring 的依赖注入,说法错误的是?(C
    A. 依赖注入通常有如下两种:设置注入和构造注入:
    B. 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入
    C. 当设值注入与构造注入同时存在时,先执行设值注入,再执行构造注入
    D. 设值注入是指 IoC 容器使用属性的 setter 方法来注入被依赖的实例。这种注入方式比较简单、直观

  11. 下列关于 Spring 特性中 IoC 描述错误的是:(A
    A. IoC 就是指程序之间的关系由程序代码直接操控
    B. 所谓“控制反转”是指控制权由应用代码转到外部容器,即控制权的转移
    C. IoC 将控制创建的职责搬进了框架中,从应用代码脱离开来
    D. 使用 Spring 的 IoC 容器时只需指出组件需要的对象,在运行时 Spring 的 IoC 容器会根据 XML 配置数据提供给它

  12. 下面有关 spring 依赖注入说法错误的是?(D
    A.IOC 就是由 spring 来负责控制对象的生命周期和对象间的关系
    B.BeanFactory 是最简单的容器,提供了基础的依赖注入支持
    C.ApplicationContext 建立在 BeanFactory 之上,提供了系统构架服务
    D.如果 Bean 的某一个属性没有注入,ApplicationContext 加载后,直至第一次使用调用 getBean 方法才会抛出异常;而 BeanFactory 则在初始化自身时检验,这样有利于检查所依赖属性是否注入

  13. 以下那个不属于 Spring Scope(作用域)的范围(C
    A. prototype B.request C.application D.session

  14. Spring 框架中的核心思想包括什么?(ABD
    A.依赖注入 B.控制反转 C.面向对象 D.面向切面

  15. AOP 技术优势在于(B
    a. 通过接口、抽象及组合增强对象内部能力
    b. 将核心关注点与横切关注点完全隔离
    c. 有利增强业务安全性
    d. 让一些公共逻辑更好的分布在对象核心逻辑中

  16. 下面有关 spring 事务,描述错误的是?(D
    A. spring 事务可以分为编程式事务和声明式事务
    B.spring 提供了一个事务的接口 PlatformTransactionManager 接口,针对不同的事务,spring 进行了不同的实现
    C. 声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码
    D. 如果你的应用中存在大量事务操作,那么编程式事务管理通常是值得的

  17. 下面有关 spring DAO,描述错误的是?(B
    A.Spring 提供的 DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    B. 方便的事务管理: Spring 的声明式事务管理力度是类级别
    C. 异常包装:Spring 能够包装 Hibernate 异常,把它们从 CheckedException 变为 RuntimeException; 开发者
    可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明
    D. Spring 提供的 DAO 支持了 JDBC、JDO 和 Hibernate

  18. 关于 Spring 理解,以下说法错误的是?(D
    page11
    A. IoC 的实现原理就是工厂模式加反射机制
    B. DI 依赖注入是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中
    C. Spring 默认使用 JDK 动态代理来创建 AOP 代理,当需要代理的类不是代理接口的时候,自动切换使用CGLIB 代理
    D. Spring 必须结合 Hiberate 或 Mybatis 实现效益最大化

  19. spring默认使用jdk动态代理,那么下面哪个配置是开启强制使用cglib代理(A
    A.aop:aspectj-autoproxy proxy-target-class=“true”
    B.aop:scoped-proxy proxy-target-class=“true”
    C.aop:aspectj-autoproxy expose-proxy=“true”
    D.aop:config proxy-target-class=“false”

  20. 在 Spring 框架中获取连接池可以有哪些方式?(ABCD
    A. DBCP 数据源
    B. C3P0 数据源
    C. Spring 的数据源实现类(DriverManagerDataSource)
    D. 获取 JNDI 数据源

  21. 下面对 spring 对 bean 的生命周期的描述,描述错误的是?(B
    A. 如 果 Bean 类有实现 org.springframework.beans.factory.BeanFactoryAware 接 口 , 工 厂 调 用
    setBeanFactory()方法传入工厂自身
    B.在 spring 中,singleton 属性默认是 false,每次指定别名取得的 Bean 时都会产生一个新的实例
    C.可以在 Bean 定义文件中使用"init-method"属性,执行到这个阶段时,就会执行 initBean()方法
    D.如果 Bean 类有实现 org.springframework.beans.factory.DisposableBean 接口,则执行他的 destroy()方法

  22. 下面有关 spring 框架模块的描述,说法错误的是?(C
    A. Spring Core:Core 封装包是框架的最基础部分,提供 IOC 和依赖注入特性
    B. AOP 模块提供了 AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置
    C. ORM 模块提供了 spring 自己的实现,而且支持常用的 Hibernate,ibtas,jdao 等框架
    D. DAO 模块 Spring 提供对 JDBC 的支持,对 JDBC 进行封装,允许 JDBC 使用 Spring 资源,并能统一管理JDBC 事物,并不对 JDBC 进行实现

  23. 以下关于 Spring 的说法是正确(BD
    A. Spring 不能和 Hibernate 一样设置 bean 是否为延迟加载
    B. 在 Spring 配置文件中,就可以设置 Bean 初始化函数和消亡函数
    C. 属性注入只能是简单数据,构造方法注入可以是对象
    D. 对象的设计应使类和构件之间的耦合最小

p名称装配及自动装配

  1. 怎样用注解的方式配置 Spring?

Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代
XML 方式的 bean 描述,可以将 bean 描述转移到组件类的内部,只需要在相关类上、方法上或
者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖
掉前者对于同一个属性的处理结果。
注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解
的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。

<beans>
 <context:annotation-config/>
 <!-- bean definitions go here -->
</beans>

在 context:annotation-config/标签配置完成以后,就可以用注解的方式在 Spring 中向
属性、方法和构造方法中自动装配变量。

下面是几种比较重要的注解类型:

  1. @Required:该注解应用于设值方法。
  2. @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
  3. @Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧
    义。
  4. JSR-250 Annotations:Spring 支持基于 JSR-250 注解的以下注解,@Resource、
    @PostConstruct 和 @PreDestroy。
  1. 使用 Spring 框架的好处是什么?
  • DI 方法使得构造器和 JavaBean properties 文件中的依赖关系一目了然。
  • IoC 容器更加趋向于轻量级。
  • Spring 利用了已有的技术比如 ORM 框架、logging 框架、J2EE、Quartz 和 JDK Timer,以及其他视图技
    术。
  • Spring 框架是按照模块的形式来组织的。
  • 要测试一项用 Spring 开发的应用程序十分简单,因为测试相关的环境代码都已经囊括在框架中了。
  • Spring 的 Web 框架亦是一个精心设计的 Web MVC 框架
  1. 什么是 Spring beans?

Spring bean 表示受到 Spring 管理的对象。具体说来,它是被 Spring 框架容器初始化、配置和管理的对象。
Spring bean 是在 Spring 的配置文件中定义,在 Spring 容器中初始化,然后注入到应用程序中的。

  1. 构造方法注入和设值注入有什么区别?
  • 在设值注入方法支持大部分的依赖注入,如果我们仅需要注入 int、string 和 long 型的变量,我们不要用设值的方法注入。对于基本类型,如果我们没有注入的话,可以为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,因为在调用构造方法中必须传入正确的构造参数,否则的话为报
    错。
  • 设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法
    注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,因为构造方法尽在对象被创建时
    调用。
  • 在使用设值注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有可能
    是不完整的。而在另一种情况下,构造器注入则不允许生成依赖关系不完整的对象。
  • 在设值注入时如果对象 A 和对象 B 互相依赖,在创建对象 A 时 Spring 会抛出
    sObjectCurrentlyInCreationException 异常,因为在 B 对象被创建之前 A 对象是不能被创建的,反之亦然。所以 Spring 用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被创建之前被
    调用的

集合bean装配

  1. 两种依赖注入的类型都是什么?

两种依赖注入的类型分别是 setter 注入和构造方法注入

  1. Spring 有几种配置方式?
  • 基于 XML 的配置
  • 基于注解的配置@override
  • 基于 Java 的配置
  1. 在 Spring 中如何注入一个 java 集合?

    Spring 提供以下几种集合的配置元素:

  • 类型用于注入一列值,允许有相同的值。
  • 类型用于注入一组值,不允许有相同的值。
  • 类型用于注入一组键值对,键和值都可以为任意类型。
  • 类型用于注入一组键值对,键和值都只能为 String 类型
  1. 请解释 Spring Bean 的生命周期?
  • Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。
  • Spring 根据 bean 的定义填充所有的属性。
  • 如果 bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。
  • 如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递 beanfactory 给 setBeanFactory 方法。
  • 如果有任何与 bean 相关联的 BeanPostProcessors,Spring 会在 postProcesserBeforeInitialization()方法内调用它们。
  • 如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调
    用此初始化方法。
  • 如果有 BeanPostProcessors 和 bean 关联,这些 bean 的 postProcessAfterInitialization() 方法将被调用。
  • 如果 bean 实现了 DisposableBean,它将调用 destroy()方法。
  1. spring 工作原理?

applicationContext.xml 中加入 bean 标记,通过 class 属性等配置信息,然后通过反射,实例化相关的 bean
对象,以及 bean 对象之间的关系

  1. 你可以在 Spring 中注入一个 null 和一个空字符串吗?

可以

  1. 什么是 Spring 的内部 bean?

内部 bean 其实很简单就是在一个 bean 的内部在装配一个 bean,那么此时的内部 bean 就不能被其他 bean
所使用。
当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义 inner bean,在
Spring 的 基于 XML 的 配置元数据中,可以在 或 元素内使用 元素,内
部 bean 通常是匿名的,它们的 Scope 一般是 prototype

SpringMVC

基础

  1. springmvc 的中心控制 servlet 是哪个类?(B
    A.ActionServlet B.Dispatcherservlet C.AbstractController D.FacesServlet
  2. 什么是 Spring MVC ?简单介绍下你对 springMVC 的理解?

Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,
View,Controller 分离,将 web 层进行职责解耦,把复杂的 web 应用分成逻辑清晰的几部分,简化开发,
减 少出错,方便组内开发人员之间的配合。

  1. SpringMVC 的流程?
    (1)用户发送请求至前端控制器 DispatcherServlet;
    (2)DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handle;
    (3)处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
    (4)DispatcherServlet 调用 HandlerAdapter 处理器适配器;
    (5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
    (6)Handler 执行完成返回 ModelAndView;
    (7)HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet;
    (8)DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
    (9)ViewResolver 解析后返回具体 View;
    (10)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
    (11)DispatcherServlet 响应用户。
  2. Springmvc 的优点?
    (1)可以支持各种视图技术,而不仅仅局限于 JSP;
    (2)与 Spring 框架集成(如 IoC 容器、AOP 等);
    (3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适
    配器(HandlerAdapter), 视图解析器(ViewResolver)。
    (4) 支持各种请求资源的映射策略
  3. 关于 Spring MVC 的核心控制器 DispatcherServlet 的作用,以下说法错误的是(C
    A. 它负责处理 HTTP 请求
    B. 加载配置文件
    C. 实现业务操作
    D. 初始化上下应用对象 ApplicationContext

数据传递

  1. 如何解决 POST 请求中文乱码问题,GET 的又如何处理呢?
    1.解决 POST 请求乱码问题:在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
</init-param>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
  1. SpringMVC 常用的注解有哪些?
    @Controller : 标注该类是控制器。
    @RequestMapping:后面跟具体的url,用在方法上是该方法的具体路径,用在类上表示所有方法的父路径。
    @RequestBody:接收体,将客户端请求过来的Json对象转成Java对象。
    @ResponseBody:响应体,将Java对象转换成Json对象,并发送给客户端。
    @PathVariable:用于获取URL中的参数,比如 ***.com/user/{id} 中ID的值。
    @RestController:RESTful风格的新api,还有@GetMapping,@PostMapping,@PutMapping,@DeleteMapping等。
    @RequestParam:当表单参数和方法形参不一致时,做一个名字的映射。

  2. SpingMvc 中的控制器的注解一般用那个,有没有别的注解可以替代?

一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替

  1. 如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置?

可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

多行数据处理

  1. 怎么样把 ModelMap 里面的数据放入 Session 里面?
    答:可以在类上面加上@SessionAttributes 注解,里面包含的字符串就是要放入session里面的 key。

  2. SpringMvc 用什么对象从后台向前台传递数据的?
    答:通过 ModelMap 对象,可以在这个对象里面调用 put 方法,把对象加到里面,前台就可以通过el 表达式拿到。

  3. SpringMvc 中函数的返回值是什么?
    答:返回值可以有很多类型,有 String, ModelAndView。ModelAndView 类把视图和数据都合并的一起的,但一般用 String 比较好

  4. 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
    答:直接在方法中声明这个对象,SpringMvc 就自动会把属性赋值到这个对象里面。5)怎样在方法里面得到 Request,或者 Session?

  5. 关于 SpringMVC,以下说法错误的是?()D
    A. SpringMvc 的核心入口是 DispatchServlet
    B. @RequestMapping 注解既可以用在类上也可以用在方法上
    C. @PathVariable 作用是取出 url 中的模板变量作为参数
    D. controller 默认是单例,通过@Scope(“prototype”)注解改为多例,成员变量共享

  6. Spring 开发模式的工作流程正确的是( )C
    1.Spring MVC 请所有的请求都提交给 DispatcherServlet
    2.DispatcherServlet 请请求提交到目标 Controller
    3.DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的Controller.
    4.视图对象负责渲染返回给客户端
    5.找到 ModelAndView 对象指定的视图对象
    6.Controller 进行业务逻辑处理后,会返回一个 ModelAndView
    A. 1-4-3-5-2-6 B. 1-2-3-4-5-6 C. 1-3-2-6-5-4 D. 1-6-5-3-4-2

  7. SpringMvc 怎么和 AJAX 相互调用的

    1、加入 Jackson.jar

    2、在配置文件中配置 json 的映射

    3、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody

Mybatis

基础

  1. 什么是 Mybatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。

  1. Mybaits 的优点?

(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在XML 里,解除sql 与程序代码的耦合,便于统一管理;提供XML 标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC 大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis 使用JDBC 来连接数据库,所以只要JDBC 支持的数据库MyBatis 都支持)。
(4)能够与Spring 很好的集成;
(5)提供映射标签,支持对象与数据库的ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

  1. MyBatis 框架的缺点?

1、mybatis的数据库移植性较差,这个是它的一个非常大的缺点了。
具体的来说,例
mysql移植到Orecle,SQL语句会有差异从而引起err
2、SQL语句编写工作量非常的大,要求熟练度非常的高

  1. MyBatis 框架适用场合?
    1. MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。
    2. 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是 不错的选择

CRUD

  1. #{}和${}的区别是什么?

    #{}是预编译处理,$ {}是字符串替换。
    Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值; Mybatis 在处理$ {}时,就是把${}替换成变量的值。
    使用#{}可以有效的防止 SQL 注入,提高系统安全性

  2. 模糊查询 like 语句该怎么写?

第1种:在Java代码中添加sql通配符。

string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
 select * from foo where bar like #{value}
</select>

第2种:在sql语句中拼接通配符,会引起sql注入

 string wildcardname = “smi”;
    list<name> names = mapper.selectlike(wildcardname);
    <select id=”selectlike”>
         select * from foo where bar like "%"${value}"%"
    </select>
  1. 如何获取自动生成的(主)键值?
    insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=
id”>
insert into names (name) values (#{name})
</insert>
name name = new name();
name.setname(“fred”);
int rows = mapper.insertname(name);
// 完成后,id 已经被设置到对象中
system.out.println(“rows inserted =+ rows);
system.out.println(“generated key value =+ name.getid());

多参数

  1. 最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
    1.DAO接口的实现原理
    答:Dao的实现原理,是Mybatis框架通过JDK动态代理接口,当调用接口方法时,代理拦截调用,并通过接口全限名+方法名组成key的方式,查找XML映射文件中的MapperStatement,返回执行SQL后的结果
    2.DAO接口的方法参数不同时,可以被重载吗?
    答:DAO接口的方法在JDK代理层面可以被重载。对于default修饰的方法mybatis会直接代理执行,而不是指向MapperStatement,所以重载default方法是有效的。
  2. 在 mapper 中如何传递多个参数?

1、第一种: DAO 层的函数

public UserselectUser(String name,String area);
对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二
参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">
	select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1}
</select>

2、第二种: 使用 @param 注解 :

public interface usermapper {
	user selectuser(@param(“username”) string username
                    ,@param(“hashedpassword”) string hashedpassword);
}

然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给 mapper):

<select id=”selectuser” resulttype=”user”>
	select id, username, hashedpassword
	from some_table
	where username = #{username}
	and hashedpassword = #{hashedpassword}
</select>

3、第三种:多个参数封装成 map

try {
    //映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的
    SQL
    //由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此
    我们使用 Map 集合来装载我们的参数
    Map < String, Object > map = new HashMap();
    map.put("start", start);
    map.put("end", end);
    return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
    e.printStackTrace();
    sqlSession.rollback();
	throw e;
} finally {
	MybatisUtil.closeSqlSession();
}

动态SQL查询

  1. mybatis,当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第一种:通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类 的属性名一致

<select id=”selectorder” parametertype=”int” resultetype=
me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>

第二种:通过来映射字段名和实体类属性名的一一对应的关系

<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用 id 属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Violent-Ayang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值