- 浏览: 119481 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
sys_ks_cnm:
我是3.1的版本 怎么还是报这个错
spring mvc结合ajax出现406错误非jackson jar包问题 -
o37927:
谢谢!!也解决了我的问题。
spring mvc结合ajax出现406错误非jackson jar包问题 -
chengcy:
也解决了我的问题,谢谢!
spring mvc结合ajax出现406错误非jackson jar包问题 -
zhuchao_ko:
Arrays.sort(keys);性能差。。。
你有强迫症哦 ...
HashMap 通过Key进行like匹配查找value -
风云无浪:
这种在通过like查找的时候,和list是一样的。HashMa ...
HashMap 通过Key进行like匹配查找value
[align=center][/align]一:java web工作原理
http协议:超文本传输协议;遵循请求响应。由客户端http请求,服务器接收后http响应; 是无状态的协议。请求响应一次结束关闭连接
Web服务器缺陷:最初是只能用静态页面....
CGI:通用网关接口,客户端每次连接服务器都在服务器的内存中开启一个进程,然后如果大量客户端一起拥入,服务器的内存会被吃掉,最后内存不足导致服务器死掉。
Java Servlet与web容器 客户端连接服务器,首先服务器在内存中开启一块内存域,然后客户端与服务器连接一次,是在一个进程里面开启一个线程,当线程数过多的时候会采取排队机制缓解......
Servlet与web容器共同处理请求和响应:客户端向服务器发送请求,如果请求的是静态页面就直接交服务器处理,如果是java web组件(Servlet,jsp)就移交给容器处理,处理完后返回给对应的servlet进行到客户端的响应。
Servlet主要任务在发送数据到服务器,提取有用信息给服务器,响应数据回复到客户端。
Web容器用于处于容器中的应用程序组建提供工作环境。
Web容器对Servlet的支持:通信支持,生命周期管理,多线程支持,jsp支持,安全性
一个web程序包括配置文件(web.xml),静态文件(html),jsp,java类文件以及各种外部包。
二:Servlet基础
Servlet: 是运行在web服务器或应用服务器上的java程序。
一个servlet就是一个java类
每一个Servlet里面都有doGet()和doPost方法、
Web容器和servlet之间使用servlet api 进行通信。
Servlet 里面web.xml文件 的 全文参数和初始化参数的区别;
全文参数 ServletContext sc = getServletConfig.getServletContext()获取此对象,
全文 :sc.getInitParameter("name");
它里面的值是整个web项目都可以读取到,公共的
初始化参数 getServletConfig.getInitParameter("name");
它是只有自身Servlet可以读取,私有的
以下是一个简单的Servlet
package com.lovo.test;
import java.io.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*@author lucky_xingxing
*Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
/*返回一个通过这个类的init方法产生的ServletConfig对象*/
ServletConfig scf = getServletConfig();
/*这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。*/
String user = scf.getInitParameter("user");
ServletContext sc = scf.getServletContext();
String contextName = sc.getInitParameter("admin");
pw.println("<html>");
pw.println("<head>");
pw.println("<title>Sharing infomation</title>");
pw.println("<body>");
pw.println("<h1>Hello Lucky_xingxing 精确模式!</h1>");
pw.println("<h1>"+user+contextName+"</h1>");
pw.println("</body>");
pw.println("</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
三:Servlet 处理http请求
http请求包括:请求头,请求行,消息体,空行。
Html表单提交两种方式:get post 默认是get方式
Get和Post 区别:get 提交的内容有长度限制(255字符),提交的数据是可见的,在地址栏可见;post 提交的内容无长度限制,提交的数据不可见,安全性相对get要高许多。
一般情况下请求是静态页面或图形文件用get,发送大数据是用post,上传文件时候也是post发送重要信息的时候也是用post.
http请求行由:请求的http方式,请求的url,http版本。
/*获取Http的请求方式*/
pw.println(request.getMethod()+"</br>");
/*获取请求的url资源,*/
pw.println(request.getRequestURI()+"</br>");
pw.println(request.getRequestURL()+"</br>");
/*获取http协议名和版本号*/
pw.println(request.getProtocol()+"</br>");
pw.println(request.getContextPath()+"</br>");
/*获取servlet映射路径*/
pw.println(request.getServletPath()+"</br>");
http请求头:了解,里面包括浏览器使用的语言类型,然后版本,字符集,等等之类的
http消息体:get请求 没有消息体,它的请求是把表单数据直接附加在url的后面,post请求才有消息体。
获取请求参数的最基本方法:例
String loginName = request.getParameter("name");
String loginPwd = request.getParameter("pwd");
请求转发只执行一次。服务器内部处理
请求转发对象: RequestDispatcher
request.getRequestDispather("/login.html");参数为html路径或者Servlet
该对象的两种转发方式:forward(请求对象,响应对象),include(请求对象,响应对象)。
Forward是直接把任务丢给自己设置的Servlet或者html.然后就没它的事了。
Include是如外包形式的。就是任务叫你做了但是完成后你还要返回来给我。
四:Servlet处理http响应
http响应包括:状态行,响应头,消息体,空行
状态行:http协议,状态码(重要),状态描述
200-299客户请求成功 300-399 表示用于已经移走的资源,指示新地址访问,
400-499客户端引起的错误 500-599 服务器端的错误。
设置常见情形的状态码方式:sendError(状态码,输出的信息);
sendRedirect(url)---用于重定向
执行两次请求,生成302应答,最后显示新的url.
getWriter()用于得到一个字符输出流,得到PrintWriter对象专门用来写文本
getOutputStream()得到一个字节输出流,得到ServletOutputStream对象。
五:web应用程序状态管理概述
因为http协议为无状态的协议,为了保证用户访问信息的保存能持续下去,所以用到状态管理。
解决方案:1.表单隐藏字段 2.Cookies 3.Session 4.URL重写
1:表单隐藏字段--<input type = "hidden" name = "name" value = "csx"/>
隐藏字段的缺点:只有当每个页面都是动态生成的时候才会有效。
2:Cookie---是web服务器发送到客户端浏览器的简短文本信息。服务器在响应请求的时候就可以将数据以键值对形式通过响应信息发送到客户端保存。信息是保存在客户端的。Cookie限制了大小--4k每条
创建Cookie cook = new Cookie("name","csx");
可以设置Cookie的生命周期
cook.setMaxage(20);//以秒为单位的
Response.addCookie(cook);//添加到响应对象中,发送给客户端。
3:Session----一个会话。session与用户的关系是一对一的,每一个用户请求产生一个session。
原理:服务器为客户端创建并维护一个session对象用来存放数据,创建session对象的时候服务器会为此session对象产生一个与之相对应的sessionID,服务器以cookie方式将此ID存放在客户端(也就是我们自己的电脑里面)
对于session一个会话的理解:我们打开浏览器到关闭浏览器这期间为一个session。在一个会话过程中,可能会向同一个应用程序发出多次请求,这些请求都共享同一个session对象,因为他们携带的ID都一样的。
Session对象是保存在服务器的,浏览器的关闭不能说Session对象被删除。
创建一个session:
HttpSession hs = Request.getSession();
hs.setAttribute("name","csx");//向session里面添加数据
hs.setMaxInactiveInterval(30) //单位是秒。不设置的情况下默认是30分钟
String name = (String)hs.getAttribute("name"); // 返回的是Object对象
hs.removeAttribute("name") //移除此名字对应的值
销毁会话有三种方式:
1:设置会话超时管理,超过了时间就自动销毁会话
2:在Session对象上调用Invalidate方法来销毁会话
3:应用结束,如服务器崩溃,强制关闭服务器等
Application与Session域范围的属性比较
不同点:绑定在Session范围内的对象只会在一个持续的会话期间被服务器来维护,而绑定在ServletContext中的对象,在整个web应用程序运行的时候都被维护。
4.uRL重写---如果客户端的浏览器禁用了Cookie(因为session对象的正常使用要依赖于cookie),那么就只有url重写作为会话跟踪的一条后路。就是把SessionID附加到URL的后面。
六-对象作用域与Servlet事件监听器
1对象作用域
作用域对象 属性操作方法 作用域范围说明
ServletContext(上下文) Void setAttribute(String)
Object getAttribute(String)
Void removeAttribute(String) 整个web应用程序
HttpSession(会话) 一个会话交互过程
ServletRequest(请求) 一次请求过程
ServletContext域:从上表可以看出ServletContext对于一个web应用只有一个对象,而且在整个应用中的所有部分都能访问到它(包括jsp)。相当于全局变量。ServletContext只要服务器不关闭,就被整个应用共享的,这导致它是线程不安全的。
会话作用域:session用于维护与同一个客户的会话状态。线程相对于安全,但是不是绝对的安全。每一个会话只能访问当前会话作用域中设置的属性。
请求作用域:请求作用域范围仅仅在于与一个请求相关的两个资源之间。Request不存在线程安全问题,因为一个请求为一个单线程。设置在请求域中的属性不能跨请求。
在请求作用域范围内设置的属性存储时间比上下文和会话的短,请求结束就会被回收。
2监听器
范围:web应用启动和销毁事件,web应用程序的属性变化(增加,删除,修改)
ServletContext事件的两个监听器(接口)需要实现以下两个接口中的一个
ServletContextListener(用于开始创建对象以及关闭的时候监听)
ServletContextAttributeListener(监听属性的变化)
HttpSession常用的两个监听器:
HttpSessionListener以及HttpSessionAttributeListener
应用都喝以上的差不多。
Request
ServletRequestListener 以及ServletRequestAttributeListe
应用都一样的。
七--过滤器
过滤器概念:作为一个中间组件,用于拦截从客户端发来的数据信息和服务器返回的数据进行过滤筛选,ok的才能通过,不然就不能通过,我自己的理解我感觉其实和if--else差不多。
书上的解释:过滤器是驻留在web服务器上的web组件,它可以过滤从客户端传递到服务器端的请求和响应。
在web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,意思就是大家都不知道你是否布置了过滤器的。
在web应用程序中可以部署多个过滤器组成过滤器链,链中的每个过滤器负责自己的过滤任务,互不干扰。客户端请求和响应在这些过滤器之间传递。
过滤器常见的应用有:认证过滤;登陆和审核过滤;加密过滤;资源访问触发事件过滤等...
所有过滤器都要实现Filter接口,里面有三个方法init(),doFilter(),destroy().
分别表示初始化(启动时由容器调用),应用,和失效。
对于过滤器的使用自己还没理解到太多。所以就暂时总结到这么些。
首先在这里补充一下关于重定向的特点:
浏览器会向服务器发送两次不通的请求,意味着就有两不同个request和 response。
用重定向技术,浏览器地址栏会发生变化
应用的特定场景:
用户登录和显示购物车的时候,通常是用重定向而不是请求转发。比如京东商城,他的购物车用的就是请求转发,这样导致了一个bug,就是当用户添加购物车成功时,再在显示成功的页面点击刷新,然后再打开购物车看,购物车数量会增加一件,也就是你刷新几次就添加了几件,但是你实际上时只添加了一件的。
还有对于response,他的getWriter方法和getOutputStream不通同时被调用,不然抛出异常的。
Jsp java server page
首先看下jsp和servlet的不同:
Servlet 服务器启动时就进行代码编译为class文件
Jsp 是用户访问到了这个jsp页面的时候web容器才进行编译
再有就是两个的后缀名不相同
当第一次访问jsp页面的时候web容器会将jsp页面翻译为servlet代码,然后只 要这个jsp内容没有改变,那么第二次访问的时候,容器不会再次编译jsp,而是直接
用翻译好了的class.
在tomcat里面所有以jsp为扩展名的url的访问请求都将由一个servlet类jspservlet负责处理,在容器中,这个类称为jsp引擎。
Jsp网页主要由元素和模板数据组成,模板数据为jsp的静态数据,比如html页面,这些会直接发送到客户端执行不会交诶容器。而元素则必须经过web容器解释
Jsp元素可以分为三个不同类别:脚本元素,指令,以及动作
脚本元素
如 脚本片段<% 写java代码 %> 脚本表达式<%= 这里面是一个表达式%> 申明<%! 可以声明变量 以及方法%>
多个脚本片段的代码可以互访,因为他们都是传到servlet里面的service方法里面的,单个脚本片段中java代码可以不完整,但是整个几个片段里面加起来的代码必须完整
主意:在脚本片段里面直接写方法是错误的,因为方法里面不能再定义方法的, 因为你写的jsp里面的代码全部都是编译为servlet然后交给里面的 service方法里面执行的,如果实在要定义方法可以使用声明 <%! %> 这样的话才是在service外面重新定义方法
Jsp的注释<%-- 注释 --%> html<!-- -->
由于这里的jsp内容在以后都不能用的,因为我们以后写的jsp 页面里面不能有脚本代码。因为一个良好的jsp页面是不能有java代码的。所以我这里就不多做解释这里的内容
2.指令(了解)
1:Page 为当前页面提供处理指令 常用的有import 每一个页面只有import属性可以写多次,其余的指令都只能写一次
其余属性:<% @page info="公司主页等等之类的" %> 主要表示此jsp页面的相关信息
<% @page contentType="text/html;charset=utf-8" %>允许jsp页面返回http头中的mime类型和字符集
<@ @page import="java.util.Date,java.io.File" %>如果在一二指令里面的话每导入一个用逗号隔开
<% @page buffer="16kb" %> 用来设置缓存的大小,默认8kb 这些值没事一般都别弄
<% @page session="fasle" %> 指示当前页面是否需要参加http会话,默认为true,
<% @page isTheadSafe="fasle" %> 指定jsp页面是否线程安全。设置为true意味着多个线程可以同时执行jsp页面的内容,多个用户同时请求该页面。 设置为false意味着只有一个用户访问jsp程序,实际应该应该设置为true
<% @page errorPage="路径" %> 指示如果当前页面发生了异常,网页会重定向到errorPage指定的页面进行处理 但是这个出现异常或者404,500错误我们一般都是直接在web xml文件里进行配置,这样就不用在每个页面都进行配置了 例如:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-Exception>Exception</error-Exception>
<location>/exception.jsp</location>
</error-page>
2:include指令:
<%@ include file="路径" %> 表示在jsp页面编译的时候插入一个包含文本或者代码的文件,把文件中的文本静态的包含过去。
它只会生成一个servlet 编译时包含的只适用于html等静态文件。
3:taglib 指令
<%@ taglib url="" prefix="" %>
这个是用来导入标签库的 jstl
3动作
<jsp:include page ="url" flush="true"/> 用来包含动态文件的
<jsp:forward page="url" /> 相当于请求转
Include指令和include动作的区别:
Include 指令只会生成一个servlet 而include动作会生成多个servlet
指令包含的是被包含页面的真实代码。而动作是包含的相应的代码
指令发生在页面编辑是,动作发生在页面请求的时候
指令修改后必须重启服务器才生效,动作保存就生效
指令包含静态文件 动作包含动态文件
Jsp 9大隐式对象
Application,Session Response Request Out Exception(把page指令里面的 errorPage 设置为true 是 exception才在service方法里出现) page pageContext Config
Out对象: 有缓存,如果在out.write("csx")后面再来一句代码 response.getWriter().write("csxcsx"),输出的效果是 后面的csxcsx 先出来,然后csx才后出来。
pageContext对象:
1.这个对象可以获取其他三个域的属性值,以及设置移除.findAttribute()方法可以查找四个狱中的对应属性的名称的值。
2.可以用来获取其他隐式对象。
目前 我们知道的四个域对象:Application(作用域:整个应用程序) HttpSession (一个会话期间) request(一次请求过程) pageContext(当前jsp页面)
javaweb 开发模式
首先 javabean回顾:
Javabean 类必须是一个公共的类。并且属性为public
Javabean类不应该有公共实例变量,变量属性都为private 访问这些变量通过get(),set()方法
实现序列化接口 serializable
<jsp:useBean> 动作
<jsp:useBean id="javaBean的一个引用名" scope ="page/request/session/application" class="java的的包名以及类名"
<jsp:setProperty>动作
<jsp:setProperty name="bean的引用名 就是usebean里面的id" property="属性名" value="属性值" />
<jsp:getProperty>动作
<jsp:getProperty name="bean引用名" property="属性名"
Jsp页面提取javabean数据
请求到jsp页面 jsp使用就是jsp:useBean 和jsp:getProperty 提数据
需要注意的是,jsp页面不用创建bean对象,创建对象的工作交给servlet,为了使jsp页面不创建bean ,使用的时候应该修改为
<jsp:useBean type="实际javabean的包以及类名" id="引用名" scope="request"<!------- 响应的你servlet里面存在哪个域里面的就在哪个域里 面提取-->
例:javabean设置值在servlet里面处理
<jsp:useBean id="calculator" type="com.lovo.bean.CalculatorBean" scope="request"/>
<jsp:getProperty property="firstNum" name="calculator"/>
<jsp:getProperty property="code" name="calculator"/>
<jsp:getProperty property="secondNum" name="calculator"/>
<jsp:getProperty property="result" name="calculator"/>
MVC开发模式:
模型(model),视图(view),控制器(Controller)
采用servlet+jsp+javabean实现javaweb开发
Servlet充当控制器 ,jsp充当试图角色;javabean充当javabean模型角色
:编写无java脚本的jsp页面
EL表达式:是一种自包含的编程语言 ${}
EL表达式中使用隐式变量
Jsp:
pageContext -用来访问jsp的隐式对象例:${pageContext.request}
作用域:
pageScope 访问page域属性的名称和值的相关联的map类
requestScope 访问request域属性的名称和值的相关联的map类
sessionScope 访问session域属性的名称和值的相关联的map类
applictionScope 访问application域属性的名称和值的相关联的map类
请求参数:
Param 包含请求参数字符串的map类 ${param.name}
JSTL jsp标准标记库
常用的是core 核心库
包括通用标记<c:catch> ,<c:out> 变量支持标记<C:set>,<c:remove>
流程控制标记<c:if> <c:shoose> <c:forEach> <c:forTokens>
Url处理标记 <c:url> <c:import> <c:redirect>
使用jstl首先要使用<%@ taglib %> 标签
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
例:以下是模拟练习jsp的JSTL 所以就直接在jsp里面写脚本代码了
<br/>-----------------c:out-------------------- <br/>
<%
request.setAttribute("name",null);
%>
<c:out value="${name }" default="aaaa" >
</c:out>
<br/>-----------------c:set可以操作各个域以及javabean和map集合-------------------- <br/>
<c:set var="date" value="xxxx" scope="page">
</c:set>
${date }
<%
Map map = new HashMap();
request.setAttribute("map",map);
%>
<c:set value="sss" var="name" target="${map }">
</c:set>
${name }
<%
Person p = new Person();
request.setAttribute("person",p);
%>
<c:set property="name" value="csx" target="${person }"> </c:set>
${p.name }
<br/>-----------------c:catch-------------------- <br/>
<c:catch var="myexception" >
<%
int x = 1/0;
%>
</c:catch>
${myexception.message }
<br/>-----------------c:if-------------------- <br/>
<c:if var="aaa" test="${name ==null }" scope="page">
aaa
</c:if>
${aaa }
<br/>-----------------c:foreach-------------------- <br/>
<% List list = new ArrayList();
list.add("csx");
list.add("ccc");
list.add("sss");
list.add("xxx");
request.setAttribute("list",list);
%>
<c:forEach var="st" items="${list }">
${st }
</c:forEach>
<br/>
<c:forEach var="num" begin="1" end="9" step="1">
${num }
</c:forEach>
<br/>------------------c:forTokens标签------------------- <br/>
<% request.setAttribute("data","aa,bb,cc,dd");
%>
<c:forTokens items="${data }" delims="," var="da">
${da }
</c:forTokens>
<br/>-----------------c:url标签-------------------- <br/>
<c:url var="get" value="/jstl/xx"></c:url>
<a href="${get }">购买</a>
<a href='<c:url value="/index.jsp"/>'>点点</a>
http协议:超文本传输协议;遵循请求响应。由客户端http请求,服务器接收后http响应; 是无状态的协议。请求响应一次结束关闭连接
Web服务器缺陷:最初是只能用静态页面....
CGI:通用网关接口,客户端每次连接服务器都在服务器的内存中开启一个进程,然后如果大量客户端一起拥入,服务器的内存会被吃掉,最后内存不足导致服务器死掉。
Java Servlet与web容器 客户端连接服务器,首先服务器在内存中开启一块内存域,然后客户端与服务器连接一次,是在一个进程里面开启一个线程,当线程数过多的时候会采取排队机制缓解......
Servlet与web容器共同处理请求和响应:客户端向服务器发送请求,如果请求的是静态页面就直接交服务器处理,如果是java web组件(Servlet,jsp)就移交给容器处理,处理完后返回给对应的servlet进行到客户端的响应。
Servlet主要任务在发送数据到服务器,提取有用信息给服务器,响应数据回复到客户端。
Web容器用于处于容器中的应用程序组建提供工作环境。
Web容器对Servlet的支持:通信支持,生命周期管理,多线程支持,jsp支持,安全性
一个web程序包括配置文件(web.xml),静态文件(html),jsp,java类文件以及各种外部包。
二:Servlet基础
Servlet: 是运行在web服务器或应用服务器上的java程序。
一个servlet就是一个java类
每一个Servlet里面都有doGet()和doPost方法、
Web容器和servlet之间使用servlet api 进行通信。
Servlet 里面web.xml文件 的 全文参数和初始化参数的区别;
全文参数 ServletContext sc = getServletConfig.getServletContext()获取此对象,
全文 :sc.getInitParameter("name");
它里面的值是整个web项目都可以读取到,公共的
初始化参数 getServletConfig.getInitParameter("name");
它是只有自身Servlet可以读取,私有的
以下是一个简单的Servlet
package com.lovo.test;
import java.io.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*@author lucky_xingxing
*Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
/*返回一个通过这个类的init方法产生的ServletConfig对象*/
ServletConfig scf = getServletConfig();
/*这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。*/
String user = scf.getInitParameter("user");
ServletContext sc = scf.getServletContext();
String contextName = sc.getInitParameter("admin");
pw.println("<html>");
pw.println("<head>");
pw.println("<title>Sharing infomation</title>");
pw.println("<body>");
pw.println("<h1>Hello Lucky_xingxing 精确模式!</h1>");
pw.println("<h1>"+user+contextName+"</h1>");
pw.println("</body>");
pw.println("</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
三:Servlet 处理http请求
http请求包括:请求头,请求行,消息体,空行。
Html表单提交两种方式:get post 默认是get方式
Get和Post 区别:get 提交的内容有长度限制(255字符),提交的数据是可见的,在地址栏可见;post 提交的内容无长度限制,提交的数据不可见,安全性相对get要高许多。
一般情况下请求是静态页面或图形文件用get,发送大数据是用post,上传文件时候也是post发送重要信息的时候也是用post.
http请求行由:请求的http方式,请求的url,http版本。
/*获取Http的请求方式*/
pw.println(request.getMethod()+"</br>");
/*获取请求的url资源,*/
pw.println(request.getRequestURI()+"</br>");
pw.println(request.getRequestURL()+"</br>");
/*获取http协议名和版本号*/
pw.println(request.getProtocol()+"</br>");
pw.println(request.getContextPath()+"</br>");
/*获取servlet映射路径*/
pw.println(request.getServletPath()+"</br>");
http请求头:了解,里面包括浏览器使用的语言类型,然后版本,字符集,等等之类的
http消息体:get请求 没有消息体,它的请求是把表单数据直接附加在url的后面,post请求才有消息体。
获取请求参数的最基本方法:例
String loginName = request.getParameter("name");
String loginPwd = request.getParameter("pwd");
请求转发只执行一次。服务器内部处理
请求转发对象: RequestDispatcher
request.getRequestDispather("/login.html");参数为html路径或者Servlet
该对象的两种转发方式:forward(请求对象,响应对象),include(请求对象,响应对象)。
Forward是直接把任务丢给自己设置的Servlet或者html.然后就没它的事了。
Include是如外包形式的。就是任务叫你做了但是完成后你还要返回来给我。
四:Servlet处理http响应
http响应包括:状态行,响应头,消息体,空行
状态行:http协议,状态码(重要),状态描述
200-299客户请求成功 300-399 表示用于已经移走的资源,指示新地址访问,
400-499客户端引起的错误 500-599 服务器端的错误。
设置常见情形的状态码方式:sendError(状态码,输出的信息);
sendRedirect(url)---用于重定向
执行两次请求,生成302应答,最后显示新的url.
getWriter()用于得到一个字符输出流,得到PrintWriter对象专门用来写文本
getOutputStream()得到一个字节输出流,得到ServletOutputStream对象。
五:web应用程序状态管理概述
因为http协议为无状态的协议,为了保证用户访问信息的保存能持续下去,所以用到状态管理。
解决方案:1.表单隐藏字段 2.Cookies 3.Session 4.URL重写
1:表单隐藏字段--<input type = "hidden" name = "name" value = "csx"/>
隐藏字段的缺点:只有当每个页面都是动态生成的时候才会有效。
2:Cookie---是web服务器发送到客户端浏览器的简短文本信息。服务器在响应请求的时候就可以将数据以键值对形式通过响应信息发送到客户端保存。信息是保存在客户端的。Cookie限制了大小--4k每条
创建Cookie cook = new Cookie("name","csx");
可以设置Cookie的生命周期
cook.setMaxage(20);//以秒为单位的
Response.addCookie(cook);//添加到响应对象中,发送给客户端。
3:Session----一个会话。session与用户的关系是一对一的,每一个用户请求产生一个session。
原理:服务器为客户端创建并维护一个session对象用来存放数据,创建session对象的时候服务器会为此session对象产生一个与之相对应的sessionID,服务器以cookie方式将此ID存放在客户端(也就是我们自己的电脑里面)
对于session一个会话的理解:我们打开浏览器到关闭浏览器这期间为一个session。在一个会话过程中,可能会向同一个应用程序发出多次请求,这些请求都共享同一个session对象,因为他们携带的ID都一样的。
Session对象是保存在服务器的,浏览器的关闭不能说Session对象被删除。
创建一个session:
HttpSession hs = Request.getSession();
hs.setAttribute("name","csx");//向session里面添加数据
hs.setMaxInactiveInterval(30) //单位是秒。不设置的情况下默认是30分钟
String name = (String)hs.getAttribute("name"); // 返回的是Object对象
hs.removeAttribute("name") //移除此名字对应的值
销毁会话有三种方式:
1:设置会话超时管理,超过了时间就自动销毁会话
2:在Session对象上调用Invalidate方法来销毁会话
3:应用结束,如服务器崩溃,强制关闭服务器等
Application与Session域范围的属性比较
不同点:绑定在Session范围内的对象只会在一个持续的会话期间被服务器来维护,而绑定在ServletContext中的对象,在整个web应用程序运行的时候都被维护。
4.uRL重写---如果客户端的浏览器禁用了Cookie(因为session对象的正常使用要依赖于cookie),那么就只有url重写作为会话跟踪的一条后路。就是把SessionID附加到URL的后面。
六-对象作用域与Servlet事件监听器
1对象作用域
作用域对象 属性操作方法 作用域范围说明
ServletContext(上下文) Void setAttribute(String)
Object getAttribute(String)
Void removeAttribute(String) 整个web应用程序
HttpSession(会话) 一个会话交互过程
ServletRequest(请求) 一次请求过程
ServletContext域:从上表可以看出ServletContext对于一个web应用只有一个对象,而且在整个应用中的所有部分都能访问到它(包括jsp)。相当于全局变量。ServletContext只要服务器不关闭,就被整个应用共享的,这导致它是线程不安全的。
会话作用域:session用于维护与同一个客户的会话状态。线程相对于安全,但是不是绝对的安全。每一个会话只能访问当前会话作用域中设置的属性。
请求作用域:请求作用域范围仅仅在于与一个请求相关的两个资源之间。Request不存在线程安全问题,因为一个请求为一个单线程。设置在请求域中的属性不能跨请求。
在请求作用域范围内设置的属性存储时间比上下文和会话的短,请求结束就会被回收。
2监听器
范围:web应用启动和销毁事件,web应用程序的属性变化(增加,删除,修改)
ServletContext事件的两个监听器(接口)需要实现以下两个接口中的一个
ServletContextListener(用于开始创建对象以及关闭的时候监听)
ServletContextAttributeListener(监听属性的变化)
HttpSession常用的两个监听器:
HttpSessionListener以及HttpSessionAttributeListener
应用都喝以上的差不多。
Request
ServletRequestListener 以及ServletRequestAttributeListe
应用都一样的。
七--过滤器
过滤器概念:作为一个中间组件,用于拦截从客户端发来的数据信息和服务器返回的数据进行过滤筛选,ok的才能通过,不然就不能通过,我自己的理解我感觉其实和if--else差不多。
书上的解释:过滤器是驻留在web服务器上的web组件,它可以过滤从客户端传递到服务器端的请求和响应。
在web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,意思就是大家都不知道你是否布置了过滤器的。
在web应用程序中可以部署多个过滤器组成过滤器链,链中的每个过滤器负责自己的过滤任务,互不干扰。客户端请求和响应在这些过滤器之间传递。
过滤器常见的应用有:认证过滤;登陆和审核过滤;加密过滤;资源访问触发事件过滤等...
所有过滤器都要实现Filter接口,里面有三个方法init(),doFilter(),destroy().
分别表示初始化(启动时由容器调用),应用,和失效。
对于过滤器的使用自己还没理解到太多。所以就暂时总结到这么些。
首先在这里补充一下关于重定向的特点:
浏览器会向服务器发送两次不通的请求,意味着就有两不同个request和 response。
用重定向技术,浏览器地址栏会发生变化
应用的特定场景:
用户登录和显示购物车的时候,通常是用重定向而不是请求转发。比如京东商城,他的购物车用的就是请求转发,这样导致了一个bug,就是当用户添加购物车成功时,再在显示成功的页面点击刷新,然后再打开购物车看,购物车数量会增加一件,也就是你刷新几次就添加了几件,但是你实际上时只添加了一件的。
还有对于response,他的getWriter方法和getOutputStream不通同时被调用,不然抛出异常的。
Jsp java server page
首先看下jsp和servlet的不同:
Servlet 服务器启动时就进行代码编译为class文件
Jsp 是用户访问到了这个jsp页面的时候web容器才进行编译
再有就是两个的后缀名不相同
当第一次访问jsp页面的时候web容器会将jsp页面翻译为servlet代码,然后只 要这个jsp内容没有改变,那么第二次访问的时候,容器不会再次编译jsp,而是直接
用翻译好了的class.
在tomcat里面所有以jsp为扩展名的url的访问请求都将由一个servlet类jspservlet负责处理,在容器中,这个类称为jsp引擎。
Jsp网页主要由元素和模板数据组成,模板数据为jsp的静态数据,比如html页面,这些会直接发送到客户端执行不会交诶容器。而元素则必须经过web容器解释
Jsp元素可以分为三个不同类别:脚本元素,指令,以及动作
脚本元素
如 脚本片段<% 写java代码 %> 脚本表达式<%= 这里面是一个表达式%> 申明<%! 可以声明变量 以及方法%>
多个脚本片段的代码可以互访,因为他们都是传到servlet里面的service方法里面的,单个脚本片段中java代码可以不完整,但是整个几个片段里面加起来的代码必须完整
主意:在脚本片段里面直接写方法是错误的,因为方法里面不能再定义方法的, 因为你写的jsp里面的代码全部都是编译为servlet然后交给里面的 service方法里面执行的,如果实在要定义方法可以使用声明 <%! %> 这样的话才是在service外面重新定义方法
Jsp的注释<%-- 注释 --%> html<!-- -->
由于这里的jsp内容在以后都不能用的,因为我们以后写的jsp 页面里面不能有脚本代码。因为一个良好的jsp页面是不能有java代码的。所以我这里就不多做解释这里的内容
2.指令(了解)
1:Page 为当前页面提供处理指令 常用的有import 每一个页面只有import属性可以写多次,其余的指令都只能写一次
其余属性:<% @page info="公司主页等等之类的" %> 主要表示此jsp页面的相关信息
<% @page contentType="text/html;charset=utf-8" %>允许jsp页面返回http头中的mime类型和字符集
<@ @page import="java.util.Date,java.io.File" %>如果在一二指令里面的话每导入一个用逗号隔开
<% @page buffer="16kb" %> 用来设置缓存的大小,默认8kb 这些值没事一般都别弄
<% @page session="fasle" %> 指示当前页面是否需要参加http会话,默认为true,
<% @page isTheadSafe="fasle" %> 指定jsp页面是否线程安全。设置为true意味着多个线程可以同时执行jsp页面的内容,多个用户同时请求该页面。 设置为false意味着只有一个用户访问jsp程序,实际应该应该设置为true
<% @page errorPage="路径" %> 指示如果当前页面发生了异常,网页会重定向到errorPage指定的页面进行处理 但是这个出现异常或者404,500错误我们一般都是直接在web xml文件里进行配置,这样就不用在每个页面都进行配置了 例如:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-Exception>Exception</error-Exception>
<location>/exception.jsp</location>
</error-page>
2:include指令:
<%@ include file="路径" %> 表示在jsp页面编译的时候插入一个包含文本或者代码的文件,把文件中的文本静态的包含过去。
它只会生成一个servlet 编译时包含的只适用于html等静态文件。
3:taglib 指令
<%@ taglib url="" prefix="" %>
这个是用来导入标签库的 jstl
3动作
<jsp:include page ="url" flush="true"/> 用来包含动态文件的
<jsp:forward page="url" /> 相当于请求转
Include指令和include动作的区别:
Include 指令只会生成一个servlet 而include动作会生成多个servlet
指令包含的是被包含页面的真实代码。而动作是包含的相应的代码
指令发生在页面编辑是,动作发生在页面请求的时候
指令修改后必须重启服务器才生效,动作保存就生效
指令包含静态文件 动作包含动态文件
Jsp 9大隐式对象
Application,Session Response Request Out Exception(把page指令里面的 errorPage 设置为true 是 exception才在service方法里出现) page pageContext Config
Out对象: 有缓存,如果在out.write("csx")后面再来一句代码 response.getWriter().write("csxcsx"),输出的效果是 后面的csxcsx 先出来,然后csx才后出来。
pageContext对象:
1.这个对象可以获取其他三个域的属性值,以及设置移除.findAttribute()方法可以查找四个狱中的对应属性的名称的值。
2.可以用来获取其他隐式对象。
目前 我们知道的四个域对象:Application(作用域:整个应用程序) HttpSession (一个会话期间) request(一次请求过程) pageContext(当前jsp页面)
javaweb 开发模式
首先 javabean回顾:
Javabean 类必须是一个公共的类。并且属性为public
Javabean类不应该有公共实例变量,变量属性都为private 访问这些变量通过get(),set()方法
实现序列化接口 serializable
<jsp:useBean> 动作
<jsp:useBean id="javaBean的一个引用名" scope ="page/request/session/application" class="java的的包名以及类名"
<jsp:setProperty>动作
<jsp:setProperty name="bean的引用名 就是usebean里面的id" property="属性名" value="属性值" />
<jsp:getProperty>动作
<jsp:getProperty name="bean引用名" property="属性名"
Jsp页面提取javabean数据
请求到jsp页面 jsp使用就是jsp:useBean 和jsp:getProperty 提数据
需要注意的是,jsp页面不用创建bean对象,创建对象的工作交给servlet,为了使jsp页面不创建bean ,使用的时候应该修改为
<jsp:useBean type="实际javabean的包以及类名" id="引用名" scope="request"<!------- 响应的你servlet里面存在哪个域里面的就在哪个域里 面提取-->
例:javabean设置值在servlet里面处理
<jsp:useBean id="calculator" type="com.lovo.bean.CalculatorBean" scope="request"/>
<jsp:getProperty property="firstNum" name="calculator"/>
<jsp:getProperty property="code" name="calculator"/>
<jsp:getProperty property="secondNum" name="calculator"/>
<jsp:getProperty property="result" name="calculator"/>
MVC开发模式:
模型(model),视图(view),控制器(Controller)
采用servlet+jsp+javabean实现javaweb开发
Servlet充当控制器 ,jsp充当试图角色;javabean充当javabean模型角色
:编写无java脚本的jsp页面
EL表达式:是一种自包含的编程语言 ${}
EL表达式中使用隐式变量
Jsp:
pageContext -用来访问jsp的隐式对象例:${pageContext.request}
作用域:
pageScope 访问page域属性的名称和值的相关联的map类
requestScope 访问request域属性的名称和值的相关联的map类
sessionScope 访问session域属性的名称和值的相关联的map类
applictionScope 访问application域属性的名称和值的相关联的map类
请求参数:
Param 包含请求参数字符串的map类 ${param.name}
JSTL jsp标准标记库
常用的是core 核心库
包括通用标记<c:catch> ,<c:out> 变量支持标记<C:set>,<c:remove>
流程控制标记<c:if> <c:shoose> <c:forEach> <c:forTokens>
Url处理标记 <c:url> <c:import> <c:redirect>
使用jstl首先要使用<%@ taglib %> 标签
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
例:以下是模拟练习jsp的JSTL 所以就直接在jsp里面写脚本代码了
<br/>-----------------c:out-------------------- <br/>
<%
request.setAttribute("name",null);
%>
<c:out value="${name }" default="aaaa" >
</c:out>
<br/>-----------------c:set可以操作各个域以及javabean和map集合-------------------- <br/>
<c:set var="date" value="xxxx" scope="page">
</c:set>
${date }
<%
Map map = new HashMap();
request.setAttribute("map",map);
%>
<c:set value="sss" var="name" target="${map }">
</c:set>
${name }
<%
Person p = new Person();
request.setAttribute("person",p);
%>
<c:set property="name" value="csx" target="${person }"> </c:set>
${p.name }
<br/>-----------------c:catch-------------------- <br/>
<c:catch var="myexception" >
<%
int x = 1/0;
%>
</c:catch>
${myexception.message }
<br/>-----------------c:if-------------------- <br/>
<c:if var="aaa" test="${name ==null }" scope="page">
aaa
</c:if>
${aaa }
<br/>-----------------c:foreach-------------------- <br/>
<% List list = new ArrayList();
list.add("csx");
list.add("ccc");
list.add("sss");
list.add("xxx");
request.setAttribute("list",list);
%>
<c:forEach var="st" items="${list }">
${st }
</c:forEach>
<br/>
<c:forEach var="num" begin="1" end="9" step="1">
${num }
</c:forEach>
<br/>------------------c:forTokens标签------------------- <br/>
<% request.setAttribute("data","aa,bb,cc,dd");
%>
<c:forTokens items="${data }" delims="," var="da">
${da }
</c:forTokens>
<br/>-----------------c:url标签-------------------- <br/>
<c:url var="get" value="/jstl/xx"></c:url>
<a href="${get }">购买</a>
<a href='<c:url value="/index.jsp"/>'>点点</a>
- web.zip (18.8 KB)
- 下载次数: 146
评论
7 楼
550208477
2011-11-19
好东西啊。正在学习哦。。
6 楼
jyjava
2011-11-19
这是个提纲,看得时候,得带着扩展的思维去看,才能有真实地收获,说实话如果你是认真地看完,得至少1个月,不过,以我目前了解的知识起码得半年,呵呵
5 楼
greatwqs
2011-11-19
很好, 总结的不错啊!
4 楼
lucky_xingxing
2011-11-19
回复三楼,我已经申请iteye 博客我才来,然后文章我是我新浪博客直接拉过来的,是不是自己写的自己看了就知道,后面附带自己写的word文档的。这些东西没必要什么地方偷来的
3 楼
yizhl
2011-11-18
看到没排版的文章我一般认为 不知道从哪里复制粘贴来的,可能都没完整的看一遍。。。
2 楼
jiangfeimail
2011-11-18
挺好,复习一下知识点
1 楼
kimifdw
2011-11-18
好东西 这个正是我现在需要的
发表评论
-
HBase Scan Filter 自定义 Comparator 比较器
2015-02-11 11:27 8640最近项目需求需要完善Sqoop的更多功能点,其中一项 ... -
HashMap 通过Key进行like匹配查找value
2014-05-29 12:08 7800import java.util.*; /** ... -
java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)
2014-04-24 13:20 12232import java.util.concurrent.Bl ... -
java用空格分割字符串
2013-05-24 14:30 11174两个词之间存在多个空格可通过下面的方式 增加一个加号即可 ... -
mysql只能localhost连接,解决不允许其他机器去访问
2013-03-14 10:04 6645ERROR 1130: Host ***.***.***. ... -
maven tomcat plugin配置
2013-03-13 16:37 964<plugin> ... -
spring mvc结合ajax出现406错误非jackson jar包问题
2012-08-29 15:35 16556苦苦研究了两天,之前对于这个问题,The resour ... -
关于单例模式的两种模式懒汉式和饿汉式的线程安全问题
2012-03-22 11:19 1583//两种单例模式 关于线程安全的问题 //饿汉式 ... -
刚学习struts1整理的笔记附带文档下载
2011-12-10 20:11 1763... -
关于使用ajax请求servletList转换Json抛的异常There is a cycle in the hierarchy!
2011-11-19 17:17 1690今天在完善自己做 ...
相关推荐
内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。摘要:本系统是采用B/S架构和Java语言结合MySQL数据库根据需求进行开发的健身房管理系统。本文将从研究背景、研究现状以及内容和可行性...
设计以Java天天购物商城系统业务为对象,系统实现用的前台开发工具是eclipse,后台数据库为MySQL,包含业务功能17项,参考文献15篇,附带1.7万字的word完整文档。设计过程中的重点和难点是对整个系统的需求分析和...
内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。摘要:物流管理系统是一个流程性的系统,系统角色分为市场负责人、调度人员、库存管理人员、运输管理人员。其中市场负责人可进入接单...
【标题】与【描述】提及的是一个JavaWeb项目——“期刊管理系统”,这通常是一个用于管理学术期刊、文章提交、审稿流程以及用户交互的Web应用。这个系统可能包含登录、注册、文章上传、审核、发布等功能,是学习...
内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。摘要:社区门诊系统的主要目的是实现数据的信息化管理,实现远程问诊,将问诊服务和购买服务快速、规范地完成,提升服务质量并且节省...
4. 帮助文档:可能是PDF或Word文档,详细说明项目的使用方法。 5. 图像资源和静态文件:如CSS样式表、JavaScript脚本,以及项目中使用的图片等。 通过这个项目,学习者能够全面掌握Java Web开发的流程,从设计...
此外,还用到Apache POI库来生成Word文档,Apache POI是Java处理Microsoft Office格式文档的标准库,使得用户可以选择不同的文件格式保存简历。 时间安排上,整个项目分为四个阶段:前两周进行需求分析和设计,中间...