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协议:超文本传输协议(HTTP,HyperTextTransfer 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
【请求行】
请求方式请求路径协议版本
*请求方式:请求方式有很多种常用的是GET和POST.
*GET和POST区别?
*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...");
}
...
}
*配置Servlet到WEB服务器.
<!--配置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:
获得文件的MIME的类型. -- 文件上传和下载.
获得全局初始化参数:
作为域对象存取数据:
读取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的概述:
JSP:JavaServer Pages.
为什么要有JSP:Servlet显示页面元素的时候有自身缺陷.
使用JSP:
*JSP的脚本:
*JSP的注释:
*JSP的内置对象:
*JSP的指令:
*JSP的标签:
JSP的脚本:
一种:<%!%> :翻译成Servlet内部的内容
二种:<% %> :翻译成Servlet的service方法内部东西.
三种:<%=%> :翻译成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的源代码中,当代表翻译成Servlet了JSP的注释就消失了.--%>
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中尽量少使用<%%>代码块.使用EL和JSTL替换页面中<%%>
使用EL表达式:
用途:
获取数据.
EL执行运算
获得常用WEB开发的对象.
调用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的标签库概述:
JSTL(JSPStandard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat4.x。在JSP2.0中也是作为标准支持的。
作用:结合EL替换页面中的<%%>
使用JSTL的标签库:
JSTL的五大标签库:core、fmt、xml、sql、fn
JSTL的版本:JSTL1.0 JSTL1.1 JSTL1.2
*JSTL1.0是EL还没有被纳入规范的时候使用标签.
*JSTL1.1和1.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}://动态获取项目名
- servlet&mvc&反射&jsp&jstl
- Spring MVC NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- Servlet-Jsp、EL、JSTL
- jstl jsp servlet 版本问题。
- web入门--jsp/servlet/JSTL
- [Servlet&JSP] JSTL的使用
- eclipse编写spring mvc时运行出现java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
- JSP-Servlet-MVC要点
- JSP/Servlet MVC模式
- servlet、JSP、MVC
- jstl与servlet动态jsp交互实现
- tomcat 、jsp、 servlet 、jstl版本对应
- JSP(2)之JDBC、JavaBean、Servlet、JSTL
- NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- JSP/Servlet-----使用JSTL标签库
- JSP/Servlet-----JSTL之core标签库
- JSP/Servlet-----JSTL之functions标签库
- textarea的placeholder无效问题解决
- ViewPager+布局xml(View)
- Max Sum 最大连续子序列和
- HDU 2036
- POJ 2098 Ellipse 笔记
- servlet&mvc&反射&jsp&jstl
- [主席树 Hash] Codechef JUNE17 #CLONEME Cloning
- CPictureEx和CPictureExWnd类,将GIF动画添加到MFC和ATL项目中
- QtIFW:制作程序安装包
- c++ builder 中的 XMLDocument 类详解(2)
- 【面试题】剑指offer07--两个栈实现一个队列
- 近期个人总结
- haha
- bzoj 2527 [Poi2011]Meteors