servlet&mvc&反射&jsp&jstl

来源:互联网 发布:cmd删除windows.old 编辑:程序博客网 时间:2024/06/05 16:11

1.1HTTP协议

1.1.1HTTP协议:

1.1.1.1协议的概念:

规定被约束的对象需要遵守的规则!!!

1.1.1.2HTTP协议:

HTTP协议:超文本传输协议(HTTPHyperTextTransfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。


HTTP协议规定浏览器(客户端)向服务器发送何种格式的数据.服务器会处理数据.向浏览器(客户端)作出响应.(向客户端发送何种格式的数据)


HTTP协议的特点:

*HTTP协议遵守一个请求响应模型.

*请求和响应必须成对出现.

*必须先有请求后有响应.

*HTTP协议默认的端口:80

1.1.1.3HTTP协议的请求部分

客户端向服务器发送的数据的格式:

GET请求方式的抓包:

GET/WEB09/demo1/subSucc.html?username=aaa&password=123 HTTP/1.1

Accept:text/html, application/xhtml+xml, */*

X-HttpWatch-RID:63397-10023

Referer:http://localhost:8080/WEB09/demo1/demo1.html

Accept-Language:zh-Hans-CN,zh-Hans;q=0.5

User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept-Encoding:gzip, deflate

Host:localhost:8080

Connection:Keep-Alive


POST方式的抓包:

POST/WEB09/demo1/subSucc.html HTTP/1.1

Accept:text/html, application/xhtml+xml, */*

X-HttpWatch-RID:63397-10049

Referer:http://localhost:8080/WEB09/demo1/demo1.html

Accept-Language:zh-Hans-CN,zh-Hans;q=0.5

User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Content-Type:application/x-www-form-urlencoded

Accept-Encoding:gzip, deflate

Host:localhost:8080

Content-Length:25

Connection:Keep-Alive

Cache-Control:no-cache


username=aaa&password=123


【请求行】

请求方式请求路径协议版本

*请求方式:请求方式有很多种常用的是GETPOST.

*GETPOST区别?

*GET:请求参数会显示到地址栏.GET方式有大小的限制.GET方式没有请求体

*POST:请求参数不会显示到地址栏.在请求体中.POST没有大小限制.POST方式有请求体.

*只有表单设置为method=post才是post请求.其他的都是get请求

【请求头】

*请求头通常都是key:value的键值对的形式.一般情况下一个key对应一个value但也有一个key对应多个value的情况.

*Referer :网站的来源.防盗链.

*User-Agent :获得客户端浏览器的信息.(文件下载:IE:URL编码火狐Base64)

*If-Modified-Since :和响应中一个头一起使用完成本地缓存的查找.

【请求体】

POST方式提交的请求参数

1.1.1.4HTTP协议的响应部分

服务器向客户端发送的数据的格式:

HTTP/1.1200 OK

Server:Apache-Coyote/1.1

Accept-Ranges:bytes

ETag:W/"147-1455670867735"

Last-Modified:Wed, 17 Feb 2016 01:01:07 GMT

Content-Type:text/html

Content-Length:147

Date:Wed, 17 Feb 2016 01:17:06 GMT


<!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Inserttitle here</title>

</head>

<body>

<h1>鎻愪氦鎴愬姛</h1>

</body>

</html>

【响应行】

协议版本状态码状态码描述

200:响应成功

302:重定向

304:查找本地缓存

404:浏览资源不存在.

500:服务器内部错误.

【响应头】

一个key对应一个value,也有一个key对应多个value的头.

Last-Modified :最后的修改文件的事件.If-Modified-Since一起使用.

Refresh :定时刷新.

Location :重定向的路径.

Content-Disposition:文件下载的时候使用的头信息.

禁用浏览器缓存:

Pragm

Expires 

Cache-Control

【响应体】

Servlet的概述】

  • 什么是Servlet

是运行在服务器端的一小的Java程序,接收和响应从客户端发送请求.

  • Servlet的作用:

处理客户端的请求,并且对请求作出响应.

  • 使用Servlet:

Servlet的入门:

*编写一个类实现Servlet接口.

publicclass ServletDemo1 implements Servlet{


@Override

publicvoid service(ServletRequest request, ServletResponse response) throwsServletException, IOException {

//System.out.println("");

response.getWriter().println("HelloServlet...");

}

...

}


*配置ServletWEB服务器.

<!--配置Servlet-->

<servlet>

<!--Servlet的名称-->

<servlet-name>aaa</servlet-name>

<!--Servlet的类的全路径-->

<servlet-class>com.itheima.servlet.demo1.ServletDemo1</servlet-class>

</servlet>

<!--配置Servlet的映射-->

<servlet-mapping>

<!--Servlet的名称-->

<servlet-name>aaa</servlet-name>

<!--Servlet的访问路径-->

<url-pattern>/servletDemo1</url-pattern>

</servlet-mapping>


1.2.4总结:

1.2.4.1Servlet的生命周期(*****

  • 生命周期:

指的是一个对象从创建到销毁的过程.

Servlet的生命周期,Servlet对象从创建到销毁的过程.


客户端第一次访问该

service方法的内部根据请求的方式的不同调用不同doXXX的方法.Servlet从服务器中移除或者关闭服务器的时候Servlet对象就会被销毁.destroy的方法就会执行.

1.2.4.2Servlet的接口的实现:

Servlet接口

|

GenericServlet通用的Servlet

|

HttpServlet HttpServlet

1.2.4.3配置Servlet的启动时加载:

web.xml<servlet>标签中配置

<load-on-startup>2</load-on-startup>

1.2.4.4配置url-pattern

【完全路径匹配】

*/开头:/aaa/aaa/bbb

【目录匹配】

*/开头*结尾:/*/aaa/* /aaa/bbb/*

【扩展名匹配】

*不能以/开始的需要以*开始如:*.jsp *.do *.action


完全路径匹配>目录匹配>扩展名匹配


练习:

有如下的一些映射关系:

Servlet1映射到/abc/*

Servlet2映射到/*

Servlet3映射到/abc

Servlet4映射到*.do

问题:

当请求URL为“/abc/a.html,“/abc/*和“/*都匹配,哪个servlet响应

Servlet引擎将调用Servlet1

当请求URL为“/abc时,“/*和“/abc都匹配,哪个servlet响应

Servlet引擎将调用Servlet3

当请求URL为“/abc/a.do时,“/abc/*和“*.do都匹配,哪个servlet响应

Servlet引擎将调用Servlet1

当请求URL为“/a.do时,“/*和“*.do都匹配,哪个servlet响应

Servlet引擎将调用Servlet2.

当请求URL为“/xxx/yyy/a.do时,“/*和“*.do都匹配,哪个servlet响应

Servlet引擎将调用Servlet2


1.2.4.5WEB开发中的路径的问题:*****

相对路径:不是以/开始的路径.

*localhost:8080/WEB09/servletDemo5

*localhost:8080/WEB09/demo2/demo1.html


绝对路径:

通常都是以/开始的路径.


带工程名的路径(客户端的路径) :

不带工程名的路径(服务器端路径) :


1.3.2.1技术分析:

Refresh的响应头】

HttpServletResponse的操作响应头的方法:

*addHeader(String name,String value); --针对一个key对应多个value头的设置

*addDateHeader(String name,long value);

*addIntHeader(String name,int value);

*setHeader(String name,String value); --针对一个key对应一个value

*setDateHeader(String name,long value);

*setIntHeader(String name,int value);


可以通过html页面中的一个标签设置头信息<meta>标签.

ServletContext*****

ServletContext :Servlet中全部的内容ServletContext都了解.一个WEB应用只有一个ServletContext对象.服务器启动的时候,服务器为每个WEB工程创建一个属于自己项目的ServletContext对象.服务器关闭的时候或者项目从服务器中移除ServletContext才会被销毁.如果将值保存在ServletContext.值就有一个作用的范围.所以这个对象称为域对象.

*保存全局性信息和数据:

*网站的访问次数:

*聊天室:

*Servlet中获得ServletContext:

*ServletContext getServletContext();


*操作这个对象的方法:

*void setAttribute(String name,Object value);

*Object getAttribute(String name);

*void removeAttribute(String name);

1.4.4.1ServletConfig:(了解)

这个对象可以获得到Servlet的配置信息:


StringservletName = this.getServletConfig().getServletName();

System.out.println(servletName);

//获得初始化参数:

Stringusername = this.getServletConfig().getInitParameter("username");

Stringpassword = this.getServletConfig().getInitParameter("password");

System.out.println(username+" "+password );


//获得所有初始化参数的名称

Enumeration<String>names = this.getServletConfig().getInitParameterNames();

while(names.hasMoreElements()){

Stringname = names.nextElement();

Stringvalue = this.getServletConfig().getInitParameter(name);

System.out.println(name+" "+value);

}

1.4.4.2ServletContext

  1. 获得文件的MIME的类型. -- 文件上传和下载.


  1. 获得全局初始化参数:


  1. 作为域对象存取数据:



  1. 读取WEB项目的文件:(***)




使用类加载器获得web项目的文件.


mvc思想
servlet-->缺点:生成html内容太麻烦
|
jsp--->缺点:阅读起来不方便,维护比较困难
|
jsp+javabean:
jsp的model1:
jsp:接受请求,展示数据
javabean:和数据打交道 
|
jsp+javabean+servlet
jsp的model2:
jsp:展示数据
javabean:和数据打交道
servlet:接受请求,处理业务逻辑
就是MVC思想的体现
MVC:
就是将业务逻辑,代码,显示相分离的一种思想
M:model 模型 作用:主要是封装数据,封装对数据的访问
V:view 视图 作用:主要是用来展示数据 一般是jsp担任的
C:ctrl 控制 作用:接受请求,找到相应的javabean完成业务逻辑
/////////////////////////
jsp设计模式1 model1:(了解)
javabean+jsp
javabean在model1使用(了解)
<!-- 接受值 -->
<jsp:useBean id="u" class="com.itheima.domain.User"></jsp:useBean><!--相当于  User u=new User()-->
<jsp:setProperty property="name" name="u"/><!--相当于  u.setName(...)-->
<jsp:setProperty property="password" name="u"/>


<!-- 打印值-->

<jsp:getProperty property="name" name="u"/>

分层:javaee的三层架构
web
作用:
展示数据 ----jsp


-----servlet-------
接受请求
找到对应的service,调用方法 完成逻辑操作
信息生成或者页面跳转
service 业务层
作用:
完成业务操作
调用dao
dao(data access object 数据访问对象)
作用:
对数据库的curd操作 


反射:
1.获取class对象
方式1:
Class clazz=Class.forName("全限定名")
方式2:
Class clazz=类名.class;
方式3:
Class clazz=对象.getClass;
2.可以获取对应类的构造方法(了解)
Constructor con = clazz.getConstructor(Class .. paramClass);
Person p = (Person) con.newInstance(参数);
3.可以通过clazz创建一个对象(了解)
clazz.newInstance();//相当于调用的无参构造器
4.可以通过clazz获取所有的字段 getFiled()(了解中的了解)
5.可以通过clazz获取所有的方法
Method m = clazz.getMethod("sleep");//获取公共的方法
Method m = clazz.getDeclaredMethod("sleep");//获取任意的方法

注意:若是私有的方法 必须让该方法可以访问
m.setAccessible(true);
6.Method对象的invoke是有返回值,他的返回值就是目标方法执行的返回值
总结:
有了class对象之后,无所不能.


JSP技术】

  • JSP的概述:

JSPJavaServer Pages.

为什么要有JSP:Servlet显示页面元素的时候有自身缺陷.

使用JSP:

*JSP的脚本:

*JSP的注释:

*JSP的内置对象:

*JSP的指令:

*JSP的标签:

  • JSP的脚本:

一种:<%!%> :翻译成Servlet内部的内容

二种:<% %> :翻译成Servletservice方法内部东西.

三种:<%=%> :翻译成out.print();

  • JSP的执行原理:

JSP也会被翻译成Servlet.被编译成class.

  • JSP的注释:

JSP支持三种注释:HTML的注释 Java代码注释JSP的注释:

<h3>HTML的注释</h3>

<!--HTML的注释:可以存在JSP源码中,翻译成的Servlet中的注释也存在,HTML的代码中也会存在.-->

<h3>Java代码的注释</h3>

<%

//单行注释可以存在于JSP源码中在翻译成Servlet的时候,Java代码的注释也是会存在的.但是生成HTML的页面之后,注释就会消失了.

/*

多行注释

*/

/**

*文档注释

*/

%>

<h3>JSP的注释</h3>

<%--JSP的注释:只会存在于JSP的源代码中,当代表翻译成ServletJSP的注释就消失了.--%>

  • JSP的指令:

JSP的指令:JSP中的三大指令。

语法:<%@指令的名称属性名=属性值属性名=属性值%>

*page指令:

*language :JSP的语言的属性.现在只能是java.

*contentType :设置浏览器默认的打开的时候的编码.

*pageEncoding :设置JSP文件保存到硬盘,以及翻译成Servlet保存到硬盘的编码格式.

*import :设置JSP中引入其他的类.import属性可以出现多次的.

*extends :设置JSP被翻译成Servlet后继承的类:默认值:org.apache.jasper.runtime.HttpJspBase.修改这个值得话一定要使这个类是一个Servlet才可以.

*autoFlush :设置自动刷出缓存

*buffer :JSP的缓冲区的大小。默认8kb

*session :默认值是true.设置JSP的页面中是否可以直接使用session对象.

*isELIgnored :设置JSP是否忽略EL表达式.默认值false不忽略.可以在JSP中写EL表达式.

*isErrorPage :设置JSP页面中出现错误信息应该如何处理的.

*errorPage :设置JSP页面中出现错误信息应该如何处理的.

*设置全局错误页面:

<error-page>

<error-code>404</error-code>

<location>/404.jsp</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/500.jsp</location>

</error-page>


*include指令:用于引入其他的页面

*file属性:属性中不能使用变量,不能传递参数

<%@include file="logo.jsp" %>

<%@include file="menu.jsp" %>


<h1>Body</h1>


<%@include file="footer.jsp" %>


*taglib指令:用于在JSP中引入标签库

<%@taglib uri="" prefix="" %>

  • JSP的内置对象:(*****)

内置对象:JSP中可以直接使用的对象.

JSP的内置对象有哪些?常用的方法?真实对象是谁?

JSP中有9个内置对象:

*request HttpServletRequest getParameter(),setAttribute(),getAttribute();

*response HttpServletResponse setStatus(),sendRedirect(),getOutputStream();

*session HttpSession setAttribute(),getAttribute(),removeAttribute();

*application ServletContext setAttribute(),getAttribute(),removeAttribute();

*page Object toString(),wait(),

翻译成

*pageContext PageContext setAttribute(),getAttribute(),removeAttribute();

*out JspWriter write(),print(),

*config ServletConfig getInitParamter(),getInitParameterNames(),

*exception Throwable getMessage(),getCause()


*out对象:先将自身缓存区中的内容输出到response的缓冲区中,由response向页面作出响应.

*out :JspWriter

*response.getWriter() :PrintWriter

*pageContext

一类:用

二类:用来存取数据

  • JSP的四个域对象:

*pageContext pageScope页面范围

*request requestScope请求范围

*session sessionScope会话范围

*application applicationScope应用范围

  • JSP的动作标签:

语法:<jsp:动作标签属性=””/>

为什么使用标签:简化代码的编写,尽量要少在JSP中使用<%%>

<jsp:forward/>

*转发:<jsp:forwardpage="/demo1/demo5.jsp"></jsp:forward>

<jsp:include/>

*包含:<jsp:includepage="/demo1/include2/logo.jsp"></jsp:include>

*****静态包含动态包含的区别?

静态包含相当于对代码的copy,最终翻译成被servlet解释执行的。动态包含是其他页面运行的结果,最后被翻译成多个servlet被解释执行

<jsp:param/>

*传递参数.

<jsp:useBean/>

<jsp:setProperty/>

<jsp:getProperty/>

EL表达式】

  • EL:

EL:ExpressionLanguage.表达式语言.

语法:${EL表达式}


JSP中尽量少使用<%%>代码块.使用ELJSTL替换页面中<%%>

  • 使用EL表达式:

用途:

  1. 获取数据.

  2. EL执行运算

  3. 获得常用WEB开发的对象.

  4. 调用Java中的函数.

  • EL用来获取数据:(获取是四个域范围中的值)

*获得普通的值:

*获得数组的数据:

*获得List集合的数据:

*获得Map集合的数据:


[].有什么区别?

[]获得带有下标的(数组,List.获得一个对象的属性,如果属性名中包含了特殊字符.必须使用[]不能使用.

<h1>EL获取数据</h1>

<%

pageContext.setAttribute("pname","王守义");

request.setAttribute("rname","王凤儿");

session.setAttribute("sname","王如花");

application.setAttribute("aname","王芙蓉");

%>

<h3>传统方式</h3>

<%=pageContext.getAttribute("pname")%>

<%=request.getAttribute("rname")%>

<%=session.getAttribute("sname")%>

<%=application.getAttribute("aname")%>

<h3>EL的方式</h3>

${pageScope.pname }

${requestScope.rname }

${sessionScope.sname }

${applicationScope.aname }

<hr/>

<%

//pageContext.setAttribute("name","王守义");

//request.setAttribute("name","王凤儿");

session.setAttribute("name","王如花");

application.setAttribute("name","王芙蓉");

%>

${name }

<h3>EL获得数组的数据</h3>

<%

String[]arrs = {"王守义","王如花","王凤儿"};

pageContext.setAttribute("arrs",arrs);

%>

${arrs[1] }

<h3>EL获得List集合的数据</h3>

<%

List<String>list = new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

pageContext.setAttribute("list",list);

%>

${list[1] }

<h3>获得Map集合的数据</h3>

<%

Map<String,String>map = new HashMap<String,String>();

map.put("aaa","111");

map.put("bbb","222");

map.put("ccc.ddd","333");

pageContext.setAttribute("map",map);

%>

${map["ccc.ddd"] }

<h3>EL获得JavaBean中的数据</h3>

<%

Personperson = new Person();

person.setId(1);

person.setName("王美丽");

pageContext.setAttribute("person",person);

%>

${person.name }

  • EL执行运算:


执行算数运算:

+- * / %

执行逻辑运算:

>< >= <= != ==

执行关系运算:

&&|| !

+:只能进行加法运算,字符串形式数字可以进行加法运算.
empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空
${empty 域中的对象名称}
三元运算符

<h1>EL执行运算</h1>

<h3>EL执行算数运算</h3>

<%

pageContext.setAttribute("n1","10");

pageContext.setAttribute("n2","20");

pageContext.setAttribute("n3","40");

pageContext.setAttribute("n4","60");

%>


${n1+n2+n3 }

<h3>EL执行逻辑运算</h3>

${n1 < n2 }

${n1 > n2 }


<h3>EL执行关系运算</h3>

${n1<n2 && n3<n4 }

${n1<n2 || n3<n4 }

<%

Personperson = new Person();

pageContext.setAttribute("person",person);

%>

${empty person }

${not empty person }

  • EL获得WEB开发的常用的对象:(EL的内置对象)

EL常用的对象:11.

${pageScope}

${requestScope}

${sessionScope}

${applicationScope}

:相当于request.getParameter();

:相当于request.getParameterValues();

${header } :获得请求头一个key对应一个value

${headerValues } :获得请求头一个key对应多个value

${initParam } :获得初始化参数

${cookie } :获得Cookie的信息

${pageContext} :相当于pageContext对象.


JSTL标签库】

  • JSTL的标签库概述:

JSTLJSPStandard TagLibraryJSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apachejakarta小组来维护的。JSTL只能运行在支持JSP1.2Servlet2.3规范的容器上,如tomcat4.x。在JSP2.0中也是作为标准支持的。


作用:结合EL替换页面中的<%%>

  • 使用JSTL的标签库:

JSTL的五大标签库:corefmtxmlsqlfn

JSTL的版本:JSTL1.0 JSTL1.1 JSTL1.2

*JSTL1.0EL还没有被纳入规范的时候使用标签.

*JSTL1.11.2的版本中EL已经被纳入到规范中.JSTL可以支持EL表达式了.

步骤一:引入标签库.

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


常用的标签:

c:set

c:if

c:forEach

c:choose

*c:when

*c:otherwise

  • JSTL的函数库(EL的函数库)

<%@taglib uri="http://java.sun.com/jsp/jstl/functions"prefix="fn" %>


${fn:length("HelloWorld") }


${fn:toLowerCase("ABCDEFG") }

${fn:toUpperCase("abcdefg") }


${fn:contains("www.baidu.com","baidu") }


常用el内置对象(11个)
cookie:
${cookie.cookie的key.value}
pageContext
${pageContext.request.contextPath}://动态获取项目名



原创粉丝点击