三、SpringMVC、Ajax、Struts

三、SpringMVC、Ajax、Struts

1. SpringMVC的运行流程?

在这里插入图片描述
【1】用户发送请求到 DispatcherServlet前端控制器;
【2】DispatcherServlet前端控制器请求 HandlerMapping处理器映射器来查找 Handler处理器;
【3】HandlerMapping处理器映射器根据 URL及一些配置(xml、注解)查找 Handler处理器,将 Handler返回给 DispatcherServlet前端控制器;
【4】DispatcherServlet前端控制器请求 HandlerAdaptor处理器适配器执行 Handler处理器;
【5】HandlerAdaptor处理器适配器执行 Handler处理器,Handler处理器返回 ModelAndView模型和视图;
【6】HandlerAdaptor处理器适配器返回 ModelAndView给 DispatcherServlet前端控制器;
【7】DispatcherServlet前端控制器调用 ViewResolver视图解析器,解析后生成 view返回给 DispatcherServlet前端控制器;
【8】DispatcherServlet前端控制器对 view调用渲染视图方法,将数据填充;
【9】DispatcherServlet前端控制器向用户响应结果 jsp。

在这里插入图片描述

2. SpringMVC有哪些组件?

在这里插入图片描述

3. 常见注解的作用?

在这里插入图片描述

4. Spring注解@Autowired和@Resource区别对比

同:@Resource和@Autowired都是做bean的注入时使用;
异:@Autowired:是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入;
@Resource:由J2EE提供,需要导入包 javax.annotation.Resource;默认按照ByName自动注入;@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略;
详细参照:https://blog.csdn.net/renwendaojian/article/details/78586249

1. 谈谈对struts的理解?(struts的工作原理、struts中的ActionServlet)

① struts是一个按 MVC模式设计的 web层框架,实质是一个强大的 servlet,负责处理请求转发和路由;
② struts的基本配置文件为 struts_config.xml,里面配置了很多 Action、ActionForm及中转规则,此文件通过 web.xml中的 ActionServlet进行加载和初始化;
③ 当用户请求发送到服务器端时,ActionServlet会接收到此请求,然后根据 struts.xml 中的配置找到对应的 Action,根据 ActionForm的配置,创建 ActionForm的实例并进行赋值,当作参数交给 Action进行业务处理,返回 ActionMapping对象,
④ ActionServlet根据 struts.xml 中 action的配置,forward到指定页面,把结果以 jsp处理过的 html返回给客户的浏览器。

2. struts1和struts2区别?

struts2 是对 struts1 进行改善;
① struts1 的前端控制器是一个 servlet,名称为 ActionServlet;
struts2 的前端控制器是一个 filter,在 2.0 中叫 FilterDispatcher,2.1中叫 StrutsPrepareAndExecuteFilter;
② struts1 的 action需要继承 Actiion类,struts2的 action可以不继承任何类; struts1对同一个路径的所有请求共享一个 Action实例,struts2对同一个路径的每一个请求分别使用一个独立的 Action对象,所有的 struts2的· Action不用考虑线程安全问题;(对用户每一次请求都创建一个 Action,所以 struts2 中的 Action是线程安全的)
③ struts21中使用 formbean封装请求参数,struts2 中直接使用 action的属性来封装请求参数;
④ struts1中的多个业务方法放在一个 Action中时(即继承 DispatcherAction时)要么都校验,要么都不校验;对于 struts2 ,可指定只对某个方法进行校验,当一个 Action继承了 ActionSupport且在这个类中只编写了 validateXx()方法,那么则只对 Xx()方法进行校验;
(印象深刻的是:struts21配置文件中的 redirect 视图的 url不能接收参数,而struts2 配置文件的 redirect视图的 url可以接受参数;)

3. struts2如何完成文件上传?

【1】导入 .jar 包;
【2】web.xml 中配置核心的过滤器;(在 src 目录下创建 struts.xml 文件,并导入文件头)
【3】三大要素:
① 表单提交方式必须是 post 提交;
② 表单设置 .entype="multipart/form-data"
③ 表单中必须有一个 <input type="file" name="photo"/>

 

1. Ajax

Ajax工作原理:相当于在用户和服务器之间加了一个中间层,使用户与服务器响应异步化;
通过 XmlHttpRequest对象向服务器发异步请求,从服务器获取数据,然后用 javascript来操作 DOM而更新页面的局部显示,在这个过程中有一个 readyState属性值一直在变,当请求完成加载时(readyState值为4)且响应成功(status值为200)时,即可处理服务器返回的结果了。
在这里插入图片描述

【1】XmlHttpRequest对象

Ajax最大特点就是无需刷新页面便可向服务器传输或读写数据,这一点得益于 XmlHttpRequest对象,它是实现一步交互的核心对象;

【2】创建XmlHttpRequest对象

【1】IE7.0以下是以 ActiveXObject的方式引入 XmlHttpRequest对象的,创建方式如下:
xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");//IE5.0、IE6.0
【2】其他浏览器(如 IE7.0,FireFox、chrome)等都支持原生的XmlHttpRequest对象,创建方式如下:
xmlHttpReq=new XMLHttpRequest();

通用的创建方式

var xmlHttpReq;//声明一个保存XmlHttpRequest的对象
function createXHR(){
	if (window.ActiveXObject) {
		xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");//IE5.0、IE6.0
	}else{
		xmlHttpReq=new XMLHttpRequest();//IE7.0及其他浏览器
	}
}

【3】创建好XmlHttpRequest异步对象后准备启动一个请求

xhr.open(method,url,asynchronous)

method:设置请求类型,主要有 get、post请求;
url:请求地址,可以是相对地址,也可以是绝对地址;
asynchyonous:默认 true异步,false为同步;

【4】设置请求头

发送请求前还可以设置请求头信息,一个 http协议主要有三部分组成:请求行、请求头信息、请求正文(请求实体);get请求无请求正文,只有 post请求有请求正文;

xhr.setRequestHeader(key,value);//可以设置多个头信息

【5】发送get请求

GET请求可直接将输入的数据放入到异步请求的 URL地址中,而 send方法不发送任何数据(open()还未发送,所以真正发送请求的是 send(),而 send()不发送任何数据)

var querystr="name=tom&age=30";
var url="login.jsp?"+querystr+"&stamptime="+new Date().getTime();
xhr.open("GET",url);//准备请求方式
xhr.send(null);//发送请求

【6】发送post请求

如果是 post请求,则将数据统一在 send()方法中发送,请求地址没有任何信息;
必须设置请求头信息来设置以表单的形式来提交内容,只有加了一个请求头才能以 post方式发送,最够通过 send()把数据作为参数进行发送;

GET、POST请求方式选择:当数据不多时采用 GET请求,数据量大时采用 POST请求;

var querystr="name=tom&age=30";
var url="login.jsp?"+"&stamptime="+new Date().getTime();
xhr.open("GET",url);//准备请求方式
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencodes");
xhr.send(querystr);//发送请求

【7】注册回调事件处理函数

当 XmlHttpRequest对象的 readyState属性值被改变时,会激发一个 readystatechange事件,可以使用 readystatechange属性来注册回调事件处理函数:

xhr.onreadystatechange=RequestCallBack;//设置回调函数

【8】readyState属性值如下:

0:未初始化;尚未调用 open()方法;(即客户端还未使用异步对象去调用 open())
1:启动;已经调用 open();(说明异步对象已经调用 open())
2:发送;已经调用 send(),但尚未收到响应;
3:接受;已经接收到部分数据;
4:完成;已经接收到全部响应数据且已经可以在客户端使用了;
只要 readyState属性值一直在变,都会触发一次 readyStatechange事件,通常我们只对 readyState值为4的阶段感兴趣,因为此时所有数据都已经就绪,即服务端数据已完全传到客户端,客户端可以开始处理了;

【9】处理服务端响应内容

在收到服务端响应后,响应的数据会自动填充到 xhr异步对象的属性中,异步对象常用的属性如下:
responseText:作为响应主体被返回的文本;
responseXML:如果服务端响应的内容类型为 “text/html” 或"application/xml" 那就返回包含的 XMl内容,否则返回 null;
status:响应 HTTP状态,200代表响应成功;
statusText:HTTP状态说明;

<head>
	<title>Ajax test</title>
	<script type="text/javascript">
		var xmlHttpReq;
		function createXMLHttpRequest(){
			if (window.ActiveXObject) {
				xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");
			}else{
				xmlHttpReq=new XMLHttpRequest();
			}
		}

		function createQueryString(){
			var userName=document.getElementById("username").value;
			var age=document.getElementById("age").value;
			var queryString="username"+userName+"&age"+age;
			return queryString;
		}

		function handleStateChange(){
			if (xmlHttpReq.readyState==4) {
				if (xmlHttpReq.status==200) {
					var cotent=xmlHttpReq.responseText;
					document.getElementById("content").innerHTML=content;
				}
			}
		}

		function startGet(){//get请求
			createXMLHttpRequest();
			var url="request.jsp?timestamp="+new Date().getTime();
			xmlHttpReq.open("get",url+"&"+createQueryString());
			xmlHttpReq.send(null);
			xmlHttpReq.onreadystatechange=handleStateChange;
		}
		function startPost(){//post请求
			createXMLHttpRequest();
			var url="request.jsp?timestamp="+new Date().getTime();
			xmlHttpReq.open("post",url);
			xmlHttpReq.setRequestHeader("Content-Type","application/x-www-form-urlencodes");
			xmlHttpReq.send(createQueryString());
			xmlHttpReq.onreadystatechange=handleStateChange;
		}

		window.onload=function(){
			document.getElementById("btnGet").onclick=startGet;
			document.getElementById("btnPost").onclick=startPost;
		}
	</script>
</head>
<body>
	<h2>please input your name and age</h2>
	<input type="text" name="userName" id="userName"/><br>
	<input type="text" name="age" id="age"/><br>
	<input type="text" name="btnGet" id="btnGet" value="get" /><br>
	<input type="text" name="btnPost" id="btnPost" value="post" /><br>
	<div id="content"></div>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值