Web后台

本文详细探讨了Web后台的相关技术,涵盖了HTTP GET和POST的区别、Servlet的生命周期与基本架构、请求处理方法、转发与重定向的差异,以及JSP、Spring、SpringMVC等关键概念。还深入讲解了session与cookie、反射技术、Spring的IOC和AOP机制,并讨论了Spring框架中的设计模式和bean的作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、HTTP 请求的 GET 与 POST 方式的区别

2、什么是 servlet

3、Servlet 的生命周期

4、Servlet 的基本架构

5、什么情况下调用 doGet()和 doPost()

6、Request 对象的主要方法 

7、forward 和 redirect 的区别 

8、jsp 有哪些内置对象?作用分别是什么 

9、JSP 的常用指令 

10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别 

11、四种会话跟踪技术作用域

12、MVC 的各个部分都有那些技术来实现?如何实现  

13、web.xml 文件中可以配置哪些内容

14、session 和 cookie 有什么区别

15、Java 反射技术主要实现类有哪些,作用分别是什么

16、讲一下什么是 Spring  

17、Spring 的 IOC 和 AOP 机制 

18、Spring 中 Autowired 和 Resource 关键字的区别 

19、依赖注入的方式有几种,各是什么

20、解释一下 spring bean 的生命周期 

21、解释 Spring 支持的几种 bean 的作用域

22、Spring 基于 xml 注入 bean 的几种方式  

23、Spring 框架中都用到了哪些设计模式 

24、Spring MVC 流程

25、SpringMVC 怎么样设定重定向和转发的 

26、SpringMVC 常用的注解有哪些


1、HTTP 请求的 GET 与 POST 方式的区别

1. get 是从服务器上获取数据,post 是向服务器传送数据;

2. 请求的时候参数的位置有区别:get 的参数是拼接在 url 后面,用户在浏览器地址栏可以看到;post 是放在 http 包的包体中;

3. 能提交的数据有区别, get 方式能提交的数据只能是文本,且大小不超过 1024 个字节,而 post 不仅可以提交文本还有二进制文件。 所以说想上传文件的话,那我们就需要使用 post 请求方式;
4. get 安全性非常低, post 安全性较高;比如说用户注册,不能把用户提交的注册信息用 get 的方式,会把用户的注册信息都显示在 Url 上,是不安全的;

2、什么是 servlet? 

Servlet 是服务器端的程序;动态生成 html 页面发送到客户端;

但是这样程序里会有很多 out.println(),java html 语言混在一起很乱,所以后来 sun 公司推出了 JSP .其实 JSP 就是 Servlet ,每次运行的时候 JSP 都首先被编译成 servlet 文件,然后再被编译成 (.class) 文件运行。有了 jsp ,在 MVC 项目中 servlet 不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制 jsp javabean 之间的流转;

3、Servlet 的生命周期

Servlet 生命周期包括三部分:

1、初始化:Web 容器加载 servlet,调用 init()方法;

2、理请求:当请求到达时,运行其 service()方法。service()自动派遣运行与请求相对应的 doXXX(doGet 或者 doPost)方法;

3、销毁:服务结束,web 容器会调用 servlet 的 distroy()方法销毁 servlet; 

 4、Servlet 的基本架构

package com.yx.test;

public class Servlet extends HttpServlet{
	
		public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
			
			
		} 
		public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
		} 
}

5、什么情况下调用 doGet()和 doPost()?

Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost();

6、Request 对象的主要方法 

setAttribute(String name,Object)设置名字为 namerequest 的参数值
getAttribute(String name)返回由 name 指定的属性值
getAttributeNames()返回 request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies()返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
getCharacterEncoding()返回请求中的字符编码方式
getContentLength()返回请求的 Body 的长度
getHeader(String name)获得 HTTP 协议定义的文件头信息
getHeaders(String name)返回指定名字的 request Header 的所有值,结果是一个枚举的实例
getHeaderNames()返回所以 request Header 的名字,结果是一个枚举的实例
getInputStream()返回请求的输入流,用于获得请求中的数据
getMethod()获得客户端向服务器端传送数据的方法
getParameter(String name)获得客户端传送给服务器端的有 name 指定的参数值
getParametervalues(String name)获得有 name 指定的参数的所有值
getRequestURI()获取发出请求字符串的客户端地址
getRemoteAddr()获取客户端的 IP 地址
getSession([Boolean create])返回和请求相关 Session
getServerName()获取服务器的名字

7、forward 和 redirect 的区别 

转发 重定向
(1) 从地址栏显示来说
forward 是服务器请求资源,服务器直接访问目标地址的 URL ,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址;
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL ;
(2) 从数据共享来说
forward :转发页面和转发到的页面可以共享 request 里面的数据;
redirect :不能共享数据;

(3) 从运用地方来说

forward :一般用于用户登陆的时候,根据角色转发到相应的模块;
redirect :一般用于用户注销登陆时返回主页面和跳转到其它的网站等;

 (4) 从效率来说

forward :高;
redirect :低;

8、jsp 有哪些内置对象?作用分别是什么 

exception
针对错误页面才可使用
request包含用户端请求信息
response包含服务器传回客户端响应信息
session与请求有关的会话期
pageContexe管理网页属性
application
服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
out向客户端输出数据
config
servlet 的架构部件
page
指网页本身

9、JSP 的常用指令 

(1) page 指令: 属性最多的指令( 实际开发中 page 指令默认 ),属性最多的一个指令,根据不同的属性,指导整个页面特性格式: <%@ page 属性名 1= "属性值 1" 属性名 2= "属性值 2" ...%>
常用属性如下:
language jsp 脚本中可以嵌入的语言种类,这个没用,写与不写一样的;
pageEncoding :当前 jsp 文件的本身编码---内部可以包含 contentType ;
contentType response.setContentType(text/html;charset=UTF-8) ;
import :导入 java 的包;
errorPage :当前页面出错后跳转到哪个页面;
isErrorPage :当前页面是一个处理错误的页面;

(2) include 指令: 页面包含(静态包含)指令,可以将一个 jsp 页面包含到另一个 jsp 页面中格式:<%@ include file="被包含的文件地址"%>;

(3) taglib 指令: 在 jsp 页面中引入标签库 (jstl 标签库、struts2 标签库)
格式: <%@ taglib uri="标签库地址" prefix="前缀"%> ;

10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别 

动态 include jsp:include 动作实现, <jsp:include page="included.jsp" flush="true"/> 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数;
静态 include include 伪码实现,不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.html" %> ;

 11、四种会话跟踪技术作用域

page :一个页面;
request ::一次请求;
session :一次会话;
application :服务器从启动到停止;

12、MVC 的各个部分都有那些技术来实现?如何实现  

MVC Model-View-Controller 的简写;
Model 代表的是应用的业务逻辑( 通过 JavaBean,EJB 组件实现 );
View 是应用的表示面( 由 JSP 页面产生 );
Controller 是提供应用的处理过程控制( 一般是一个 Servlet );
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用;

 13、web.xml 文件中可以配置哪些内容

web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面;

 14、session 和 cookie 有什么区别

1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上;

2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session; 

3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie;

4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie;

 15、Java 反射技术主要实现类有哪些,作用分别是什么

在 JDK 中,主要由以下类来实现 Java 反射机制,这些类都位于 java.lang.reflect 包中:

(1) Class 类:代表一个类;
(2) Field 类:代表类的成员变量 ( 属性 ) ;
(3) Method 类:代表类的成员方法;
(4) Constructor 类:代表类的构造方法;
(5) Array 类:提供了动态创建数组,以及访问数组的元素的静态方法;

16、讲一下什么是 Spring  

Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。

 主要由以下几个模块组成:

Spring Core :核心类库,提供 IOC 服务;
Spring Context :提供框架式的 Bean 访问方式,以及企业级功能 ( JNDI、定时任务等 );
Spring AOP AOP 服务;
Spring DAO :对 JDBC 的抽象,简化了数据访问异常的处理;
Spring ORM :对现有的 ORM 框架的支持;
Spring Web :提供了基本的面向 Web 的综合特性,例如多方文件上传;
Spring MVC :提供面向 Web 应用的 Model-View-Controller 实现;

17、Spring 的 IOC 和 AOP 机制 

IOC:控制反转也叫依赖注入。利用了工厂模式 :
将对象交给容器管理,你只需要在 spring 配置文件总配置相应的 bean ,以及设置相关的属性,让 spring 容器来生成类的实例对象以及管理对象。在 spring 容器启动的时候, spring 会把你在配置文件中配置的  bean 都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些 bean 分配给你需要 调用这些 bean 的类(假设这个类名是 A),分配的方法就是调用 A 的 setter 方法来注入,而不需要你在 A 里面 new 这些 bean 了;
AOP:面向切面编程。( Aspect-Oriented Programming):
AOP 可以说是对 OOP 的补充和完善。 OOP 引入 封装、继承和多态性 等概念来建立一种对象层次结构, 用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候, OOP 则显得无能为力。 也就是说, OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。
将程序中的交叉业务逻辑( 比如安全,日志,事务等 ),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.
简单点解释,比方说你想在你的 biz 层所有类中都加上一个打印‘你好’的功能,这时就可以用 AOP 思想来做.

18、Spring 中 Autowired 和 Resource 关键字的区别 

@Resource  @Autowired 都是做 bean 的注入时使用,其实  @Resource 并不是 Spring 的注解,它的包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。
1 、共同点
两者都可以写在字段和 setter 方法上。
两者如果都写在字段上,那么就不需要再写 setter 方法。
2 、不同点
(1) @Autowired
@Autowired为 Spring 提 供 的 注 解
, 需 要 导 入 包 org.springframework.beans.factory.annotation.Autowired ; 只按照 byType 注入。
package com.yx.test;

public class AutowiredAndResource {

	// 下面两种@Autowired 只要使用一种即可
	@Autowired 
	private UserDao userDao; // 用于字段上
	@Autowired 
	public void setUserDao(UserDao userDao) { 
		// 用于属性的方法上
		this.userDao = userDao; 
		}
	}
	
}

 @Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结

@Qualififier 注解一起使用。如下:
package com.yx.test;

public class AutowiredAndResource {
	@Autowired
	@Qualifier("userDao") 
	private UserDao userDao;
}

 (2)  @Resource

@Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包 javax.annotation.Resource ;
@Resource 有两个重要的属性: name type ,而 Spring @Resource 注解的 name 属性解析为 bean 名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使用 byName 的自动注入策 略,而使用 type 属性时则使用 byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
注:
最好是将 @Resource 放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、
get 去操作属 性,而不是直接去操作属性。
package com.yx.test;

public class AutowiredAndResource {
	// 下面两种@Resource 只要使用一种即可
	@Resource(name="userDao") 
	private UserDao userDao; // 用于字段上 
	@Resource(name="userDao")
	public void setUserDao(UserDao userDao) { 
		// 用于属性的 setter 方法上 
		this.userDao = userDao; 
		}
	}
}

 @Resource 装配顺序:

①如果同时指定了 name type ,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
②如果指定了 name ,则从上下文中查找名称(id )匹配的 bean 进行装配,找不到则抛出异常。
③如果指定了 type ,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛 出异常。
④如果既没有指定 name ,又没有指定 type ,则自动按照 byName 方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource 的作用相当于 @Autowired ,只不过 @Autowired 按照 byType 自动注入。

 19、依赖注入的方式有几种,各是什么

1、构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入;
优点:
对象初始化完成后便可获得可使用的对象;
缺点:
当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦;
2、setter 方法注入
IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类;
优点:
灵活。可以选择性地注入需要的对象;
缺点:
依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用;
3、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象;
优点
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可;
缺点:
侵入行太强,不建议使用;
PS:什么是侵入行?
如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性;

20、解释一下 spring bean 的生命周期 

首先说一下 Servlet 的生命周期:实例化,初始 init,接收请求 service,销毁 destroy
Spring 上下文中的 Bean 生命周期也类似,如下:
(1)实例化 Bean
对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefifinition 对象中的信息,实例化所有的 bean;
(2)设置对象属性(依赖注入):
实例化后的对象被封装在 BeanWrapper 对象中,紧接着, Spring 根据 BeanDefifinition 中的信息 以及 通过 BeanWrapper 提供的设置属性的接口完成依赖注入;
(3)处理 Aware 接口:
接着, Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean
①如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId) 方法,此处传递的就是 Spring 配置文件中 Bean id 值;
②如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory() 方法,传递的是 Spring 工厂自身;
③如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用
setApplicationContext(ApplicationContext) 方法,传入 Spring 上下文;
( 4)BeanPostProcessor
如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, String s) 方法;
( 5) InitializingBean init-method
如果 Bean Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法 ;
( 6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s) 方法;由于这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后, Bean 就已经被正确创建了,之后就可以使用这个 Bean
( 7) DisposableBean
Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy() 方法;

 (8)destroy-method

最后,如果这个 Bean Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

 21、解释 Spring 支持的几种 bean 的作用域

Spring 容器中的 bean 可以分为 5 个范围:
( 1) singleton :默认,每个容器中只有一个 bean 的实例,单例的模式由 BeanFactory 自身来维护;

(2) prototype:为每一个 bean 请求提供一个实例; 

(3) request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收;

 (4) session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean会随之失效。

(5) global-session :全局作用域, global-session Portlet 应用相关。当你的应用部署在 Portlet 容器中工作时,它包含很多 portlet 。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局变量需要存储在 global-session 中。全局作用域与 Servlet 中的 session 作用域效果相同;

22、Spring 基于 xml 注入 bean 的几种方式  

(1) Set 方法注入;
(2) 构造器注入:①通过 index 设置参数的位置;②通过 type 设置参数类型;
(3) 静态工厂注入;
(4).......

23、Spring 框架中都用到了哪些设计模式 

(1)工厂模式: BeanFactory 就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式: Bean 默认为单例模式;
(3)代理模式: Spring AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate ;
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring listener 的实现-- ApplicationListener

 24、Spring MVC 流程

工作原理:

1、 用户发送请求至前端控制器 DispatcherServlet

2、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
3、 处理器映射器找到具体的处理器( 可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成 )一并返回给 DispatcherServlet
4、 DispatcherServlet 调用 HandlerAdapter 处理器适配器。
5、 HandlerAdapter 经过适配调用具体的处理器( Controller,也叫后端控制器 )。
6、 Controller 执行完成返回 ModelAndView
7、 HandlerAdapter controller 执行结果 ModelAndView 返回给 DispatcherServlet
8、 DispatcherServlet ModelAndView 传给 ViewReslover 视图解析器。
9、 ViewReslover 解析后返回具体 View
10、 DispatcherServlet 根据 View 进行渲染视图( 即将模型数据填充至视图中 )。
11、 DispatcherServlet 响应用户。

25、SpringMVC 怎么样设定重定向和转发的 

(1) 转发:在返回值前面加" forward :",比如 "forward:user.do?name=method4"
(2) 重定向:在返回值前面加" redirect :",比如"redirect:http://www.baidu.com

 26、SpringMVC 常用的注解有哪些

@RequestMapping :用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody :注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。
@ResponseBody :注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值