当前位置:文档之家› javaweb总结

javaweb总结

[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;

public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();

ServletConfig scf = getServletConfig();

String user = scf.getInitParameter("user");
ServletContext sc = scf.getServletContext();
String contextName = sc.getInitParameter("admin");
pw.println("");
pw.println("");
pw.println("Sharing infomation");

pw.println("");
pw.println("

Hello Lucky_xingxing 精确模式!

");
pw.println("

"+user+contextName+"

");
pw.println("");
pw.println("");
}

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版本。

pw.println(request.getMethod()+"
");

pw.println(request.getRequestURI()+"
");
pw.println(request.getRequestURL()+"
");

pw.println(request.getProtocol()+"
");
pw.println(request.getContextPath()+"
");

pw.println(request.getServletPath()+"
");

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.Sessio

n 4.URL重写
1:表单隐藏字段--
隐藏字段的缺点:只有当每个页面都是动态生成的时候才会有效。
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文件里进行配置,这样就不用在每个页面都进行配置了例如:

404
/404.jsp


Exception
/exception.jsp


2:include指令:
<%@ include file="路径" %> 表示在jsp页面编译的时候插入一个包含文本或者代码的文件,把文件中的文本静态的包含过去。
它只会生成一个servlet 编译时包含的只适用于html等静态文件。

3:taglib 指令
<%@ taglib url="" prefix="" %>
这个是用来导入标签库的 jstl

3动作
用来包含动态文件的
相当于请求转
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页面提取javabean数据
请求到jsp页面 jsp使用就是jsp:useBean 和jsp:getProperty 提数据
需要注意的是,jsp页面不用创建bean对象,创建对象的工作交给servlet,

为了使jsp页面不创建bean ,使用的时候应该修改为

例:javabean设置值在servlet里面处理






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类 ${https://www.doczj.com/doc/c76027864.html,}

JSTL jsp标准标记库
常用的是core 核心库
包括通用标记 , 变量支持标记,
流程控制标记
Url处理标记
使用jstl首先要使用<%@ taglib %> 标签
<%@taglib uri="https://www.doczj.com/doc/c76027864.html,/jsp/jstl/core" prefix="c" %>
例:以下是模拟练习jsp的JSTL 所以就直接在jsp里面写脚本代码了


-----------------c:out--------------------

<%
request.setAttribute("name",null);
%>





-----------------c:set可以操作各个域以及javabean和map集合--------------------



${date }

<%
Map map = new HashMap();
request.setAttribute("map",map);
%>


${name }

<%
Person p = new Person();
request.setAttribute("person",p);
%>

${https://www.doczj.com/doc/c76027864.html, }


-----------------c:catch--------------------


<%
int x = 1/0;
%>

${myexception.message }


-----------------c:if--------------------


aaa

${aaa }

-----------------c:foreach--------------------


<% List list = new ArrayList();
list.add("csx");
list.add("ccc");
list.add("sss");
list.add("xxx");
request.setAttribute("list",list);
%>

${st }


/>

${num }




------------------c:forTokens标签-------------------

<% request.setAttribute("data","aa,bb,cc,dd");
%>

${da }



-----------------c:url标签--------------------


购买

点点

相关主题
文本预览
相关文档 最新文档