1、HTTP协议基础
HTTP(Hypertext Transfer Protocol, 超文本传输协议)
HTTP是以明文方式发送数据的
用于从WWW服务器传输超文本到本地浏览器的传输协议。
HTTP协议是以TCP/IP为基础的高层协议。
现在广泛使用的版本HTTP/1.1
2、PrintWriter
打印流 不会抛异常 自动flush 检查状态吗
3、GenericServlet和HttpServlet
GenericServlet和HttpServlet 没有实现service方法,只是抽象方法
HttpServlet 实现了service方法
4、Service方法
service(ServletRequest req, ServletResponse res) 从接口中带过来的 分发客户端请求到受保护的service方法中
service(HttpServletRequest req, HttpServletResponse resp) 具体到http协议的细节了,接收到了客户端请求,并把它们分发到doXXX方法中去
tomacat调用service(ServletRequest req, ServletResponse res)调用service(HttpServletRequest req, HttpServletResponse resp) 调用doXXX方法
servlet在响应客户端请求时,一般情况下都重写dopost和doget方法,也可以重写service方法,但不常用。
5、客户端表单和web.xml
表单<form action=/asdfasdf method=post/get> </form>
form表单中action的"/"表示的是http://127.0.0.1:8080/ 代表的是域名的访问路径,不包括web应用程序的名称
web.xml中url-pattern的"/"表示的是http://127.0.0.1:8080/目录/ 代表的是web应用程序的路径
做项目要仔细!
form表单中action字段,如果不是以http打头的,或不是以/打头的都是绝对路径。
如果是相对路径,如action=my/aaa.jsp 这样是不行的。除非在 web.xml的url-pattern修改<url-pattern>/my/my/aaa.jsp</url-pattern>
解决页面乱码问题:resp.setContentType("text/html;charset=gbk");在打印流获取之前设置编码
web.xml最后改
6、servlet生命周期
servlet生命周期,在servlet为客户端提供服务时,只有一个servlet对象。当用户第一次访问servlet(当第一个请求过来时),tomcat就会new 出servlet(实例).new完之后,调用init方法,而且init方法也只调用一次,然后以多线程的方式处理客户端请求,
调用service----调用service-----调用doget或dopost方法。
多线程:线程池。让线程跑起来,当第n请求来时,tomacat会从线程池分配处理第n个请求.每个线程访问的是同一个servlet对象。
destory:servlet退出服务的时候(web应用程序退出,web应用程序重新加载了) 调用destory
只有一个对象。
7、Servlet从上一页面取参数(一)
一般不要在servlet设置成员变量。
ServletConfig:代表servlet的配置信息;
this.getServletConfig.getServletName();得到servlet名称
this.getServletConfig.getInitParameter("name");得到<init-param>
四个问号:一个汉字一个问号
解决方法:
s=new String(s.getBytes("iso8859-1"),"GBK");
s=new String(s.getBytes("utf8"),"GBK");
循环取出所有参数
java.util.Enumeration params = this.getServletConfig()
.getInitParameterNames();
for (; params.hasMoreElements();) {
String name = params.nextElement().toString();
String value = this.getServletConfig().getInitParameter(name);
value = new String(value.getBytes("iso8859-1"),"GBK");
out.println(value);
}
tomcat 调用init(ServletConfig config)
public void init(ServletConfig config) throws ServletException{
this.config=config;
this.init();
}
我们覆盖的时候只覆盖init()方法就行了。
8、Get方式和post方式的乱码问题
取参数:request.getParameter("param1");
request.setCharacterEncoding("gbk");解决post方式提交内容的乱码,一定要写在存取第一个参数之前。因为一旦取第一个参数了,会把所有参数存到一个容器去。不要调用
response.setCharacterEncoding("gbk");
解决get方式提交的乱码:tomcat--->修改server.xml--URIEncoding="GBK"
9、Servlet从上一页面取参数(二)
通过一个名字取出多个值:第一种方法:
Enumeration paramNames=request.getParameterNames();取出所有INPUT的名字
while(paramNames.hasMoreElements())
{
String paramName=(String)paramNames.nextElement();
String paramValues=request.getParameterValues(paramName);
if(paramValues.length==1)
{
String paramValue=paramValues[0];
}
else
{
for(i=0;i<paramValues.length;i++)
{
}
}
}
第二种方法:
Map<String String[]> paramMap=request.getParameterMap();
Set<Map.Entry<String,String[]>> entries=paramMap.entrySet();
for(Iterator<Map.Entry<String,String[]>> it=entries.iterator();it.hasNext();){
Map.Entry<String,String[]> entry=it.next();
String paramName=entry.getKey();
String[] paramValues=entry.getValue();
if(paramValues.length==1)
{
String paramValue=paramValues[0];
if(paramValue.length()==0)
print(novalue);
else
print(paramValue)
}
else
{
for(i=0;i<paramValues.length;i++)
print(paramValues[i]);
}
}
10、Cookie 编程
http协议无连接性。www.sina.com.cn 回车 下载完网页后就断掉了。
基于核心的业务编程,不要使用cookie编程。
Cookie cookie=new Cookie("name","value");
response.addCookie(cookie);
cookie=new Cookie("name1","value1");
cookie.setMaxAge(3600);
response.addCookie(cookie);
cookie[] cookies=request.getCookies();
if(cookies!=null){
Cookie cookie;
for(int i=0;i<cookies.length;i++)
{
cookie=cookies[i];
cookie.getName();
cookie.getValue();
}
}
cookie的特点:
1、服务器可以向客户端写内容;
2、只能是文本内容; 长度不能超过4K
3、客户端可以阻止服务器写入;
4、只能拿自己webapp写入的东西
5、Cookie分为两种
属于窗口/子窗口(放在内存中)
属于文本(有生命周期的)
6、一个servlet/jsp设置的cookies 能够被同一个路径下面或者子路径下面的servlet/jsp读到(路径=URL)
(路径!=真实文件路径)
父路径:http://127.0.0.1/my/SetCookies
子路径:http://127.0.0.1/my/servlet/ShowCookies
11、Session 编程
session对象是写在服务器端,大小无限制。
HttpSession session=request.getSession(true);
Integer accessCount = (Integer)session.getAttribute("accessCount");
session.setAttribute("accessCount",accessCount);
session.getId();
new Date(session.getCreationTime());
new Date(session.getLastAccessedTime());
有父子关系的都是一个session
session.isNew();
request.getRequestedSessionId();从客户端取回来的id号
request.isRequestedSessionIdFromCookie();
request.isRequestedSessionIdFromURL();
request.isRequestedSessionIdValid();是不是合法的有效的sessionid;
response.encodeURL(request.getRequestURL().toString());URL重写
request.getRequestURL().toString();
session总结
1、服务器的一块内存(存key-value)
2、配置过期时间:conf/web.xml <session-config>
3、和客户端窗口对应(子窗口)(独一无二)
4、客户端和服务器都有对应的SessioID
5、客户端向服务器端发送SessionID的时候两种方式:
1、cookie(内存cookie)
2 重写URL
6、浏览器禁掉cookie,就不能使用session(使用cookie实现的session)
7、如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写(大大增加编程负担),所以很多网站要求客户打开cookie打卡
12、Application编程
ServletContext application=this.getServletContext(); 我们写的servlet和tomcat打交道。
Integer accessCount=(Integer)application.getAttribute("accesscount");
application.setAttribute();
比session更大的篮子。
访问同一个web应用程序上的各种servlet,无论是不是同一session都会访问servletContext对象,都会访问这个篮子。
<!--EndFragment-->