1、使用 GET 方法请求的页面可以设置为书签或通过电子邮件发送 ; POST 方法用于发送敏感信息(如信用卡号、密码等)
2、servlet就是一个在服务器端运行以处理客户端请求的java文件(request请求<-->response响应)
Servlet/jsp 运行环境:浏览器/服务器/数据库
Tomcat是一个免费的开源的Servlet容器,它是apache基金会的jakarta项目中的一个核心项目,由apache,sun和其它一些公司及个人共同开发而成
3、分析清楚以下类的关系
抽象类HTTPServlet继承GenericServlet实现了Servlet接口和ServletConfig接口 的类Servlet GenericServlet抽象类实现了Servlet接 口和ServletConfig接口 的 类ServletConfig4、Servlet的生命周期
Servlet部署在Tomcat...容器里,它的生命周期由容器管理
实例化(Servlet容器通过构造函数来创建Servlet的实例)――>装载->创建->初始化――>服务――>销毁――>不可用5、设置文本格式: response.setContentType(“text/html;charset=GBK”);
PrintWriter out= response.getWriter();
out.println(“<html><body>您好!</body></html>”);6、Servlet与JSP的关系:JSP转译后的.java文件与Servlet的处理方式一样;Servlet是JSP技术的基础
ServletConfig 接口 ――> 在初始化的过程中由 Servlet 容器使用
ServletContext 接口 ――> 定义 Servlet用于获取来自其容器的信息的方法
ServletRequest 接口 ――> 向服务器请求信息
ServletResponse 接口 ――> 响应客户端请求7、Servlet产生后需登记:
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>a**.y2.servlet.l1.HelloServlet</servlet-class>
<init-param>//初始化需要的东西
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
在service方法中服务时得到初始化的值:Stringencod=this.getServletConfig().getInitParameter("encoding");8、给我们刚定义的Servlet分配工作 Servlet映射
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>9、//初始化Servlet的方法 让Servlet做好提供服务的准备Tomcat会把配置文件的内容封装到config对象中交给Servlet
public void init(ServletConfig config) throws ServletException{
this.config=config;
System.out.println("init方法被调用");
}10、JBuilder 是用于开发 Web 应用程序(如Servlet、Applet 和 JSP)的一种非常有用的软件
JBuilder 提供三种类型的 Servlet,即标准 Servlet、监听器 Servlet 和过滤器 Servlet11、创建自己的servlet有三种方式:实现servlet接口;继承GenericServlet类;继承HttpServlet类;
The second Lesson ― ― HttpServlet类1、继承HttpServlet类,只需写doPost方法及doPost(request,response);2、首先处理中文乱码问题,遵循以下规则:
1.在任何地点,只使用同一种编码。强烈推荐使用"utf-8"
2.form表单提交的参数如果包含中文乱码,根据提交方式进行处理:
post方式只需采用request.setCharacterEncoding("utf-8");
get方式在前者的前提下还需进一步处理:参数名=newString(参数名.getBytes("iso-8859-1"),"utf-8");
3.向客户响应时避免乱码,则需要:
response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");3、获得http头部请求的头信息
Enumeration heads=request.getHeaderNames();//得到所有的请求头名字是键值对的方式
heads.hasMoreElements()方法:判断是否还存在为遍历的元素
String head=heads.nextElement().toString();方法:得到枚举中下一个元素
request.getHeader(head);方法:根据名字获得值同理获取从jsp页面传来的值,若不知其表单名,又由于checkbox复选框名字相同,可能需获得多值,则需进行以下处理:String met=request.getMethod().toLowerCase();//得到页面是以哪种方式进行提交
Enumeration pars = request.getParameterNames();//获得表单中的所有名字
Map map = request.getParameterMap();
while(pars.hasMoreElements()){
String parName=pars.nextElement().toString();
String parValues[]=(String[])map.get(parName);//根据名字name获得value值
for(int i=0;i<parValues.length;i++){
System.out.println();}
4.用户跟踪:HttpSessionsession=request.getSession();session.setAttribute("user",name);
response.sendRedirect("../success.jsp");取值最好采用:${sessionScope.user}5.模型:model1:java想写哪就哪(落后) ; model2:jstl/el/javabean(小型网站) ;
model3:判断/操作语句不应该出现在jsp页面,应该在 Servlet页面来处理;尽可能的降低java代码在jsp中出现的频率6.RequestDispatcher对象的forward()方法 ;JSP的forward动作实质是RequestDispatcher技术 ;
The third Lesson ― ― 搭建三层架构1、重定向:response.sendRedirect("index.jsp"); //请求两次,地址栏中的地址发生改变
转发:request.getRequestDispatcher("index.jsp").forward(request,response);//请求一次,地址栏中的地址不发生改变2、使用范围
page当前用户在当前页面中可使用(最新访问)
servletContext:上下文(在当前运行下所处的一种状态与环境对应jsp中的application)获得:this.getServletContext()
request:当前用户在档次请求中有效3、三层
jsp围绕Servlet进行运转,从而Servlet充当了一个重要的角色,有人说Servlet是核心部位/中央集权/中央控制器添加构造函数:右键->source->GenerateConstructorusing Fieldsdb:连接与关闭数据库的两个方法
dao:操作数据库中的表
web:存储Servlet类:三部曲:1、收集信息 2、数据提交数据库 3、判断结果 确定转发路径
entity:实体类
buzi:商务处理 在这个类里主要负责user对象的业务逻辑处理 但不涉及数据库
流程:jsp->web->buzi->dao(db)The forth Lesson ― ― Oracle驱动1、加载Oracle驱动包:oracle.jdbc.driver.OracleDriver;2、配置URL连接Oracle数据库:jdbc:oracle:thin:@127.0.0.1:1521:orcl;
若忘记,便捷方式:切换成Myeclipse Database Explorer的DB Browser视图,右键edit进行填空完成后,注Driver template 选择的是:Oracle(Thin driver)按TestDriver进行测试3、jdbc驱动包括:1、jdbc的接口集 由sun公司提供 2、各个数据库厂商的jdbc驱动的实现除odbc是由sun公司实现外4、jdbc中的包.jar jdbc用来访问数据库其实类似于房子中介5、在servlet中是绝对绝对不能定义成全局变量的,应为是一个servlet在服务,否则可能会造成线程冲突6、迭代器Iterator是由集合提供的,用来帮助无法使用for循环遍历的集合如Map,Set进行查询操作,而对删除集合中的数据,也通常需要使用迭代器
The Fifth Lesson ― ― 过滤器(filter)
1、filter就是过滤request和response中的数据,过滤完成了,必须把请求继续转发给servlet处理数据,响应给客户端过滤器并没有产生request和response,只是对这两个对象中的数据进行过滤2、filter在整个过程中类似于一个保安,其中的doFilter()方法是进行过滤处理的,参数FilterChain 是一个过滤链条FileterConfig配置,intit初始化方法也就是上岗前的学习3、过滤器可用之处1、编码转换 / 2、安全性检查 等4、<filter-mapping>中写的是<filter-name>loginServlet</filter-name></filter-mapping>只过滤这个loginServlet对应的Servlet,后台访问admin文件夹下的jsp页面时,不是在页面登录提交就进入了checkfilter过滤器,而是在重定向到admin下的jsp页面时才进入过滤器的5、数据库连接池(MVC
Model View Controller)三配置:一配置tomcat->conf-->context.xml文件在标签<Context>中写<Resourcename="jdbc/myoracle" auth="Container" type="javax.sql.Datasource"driverClassName="oracle.jdbc.driver.OracleDriver"url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" username="scott"password="a**"
maxActive="4" maxIdle="2"maxWait="-1"/>二配置工程中的web.xml文件<resource-ref>
<description>Oracle Datasourceexample</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
三编写通过jdni进行配置Context initContext=new InitialContext();//得到Tomcat中提供的服务的总目录ContextenvContext=(Context)initContext.lookup("java:/comp/env");//查找名叫"java:/comp/env"的子目录这个名字是固定的,不能写错DataSourceds=(DataSource)envContext.lookup("jdbc/myoracle");//在子目录中再去查找名字叫jdbc/myoracle的服务,这个服务就是提供数据库连接池的服务
//也就是我们在Tomcat的config目录中的Context.xml中所配置的myoracle连接池服务Connection con=ds.getConnection();//从连接池中获得数据库连接注意须将驱动包放入至tomcat->common->lib的文件夹下 和server->lib的文件下6、实用标签库减少代码Java Server Pages 标准标签库 (JSTL) 用于访问 SQL 数据库、国际化标签以及在 JSP页面中显示值通用标签用于显示、设置和删除 JSP 页面内的变量值
条件标签(如 if 和 choose)用于根据条件执行操作
迭代标签(如 forEach 和 forTokens)用于多次执行标签体7、FilterConfig 接口包含以下方法:getFilterName(); getInitParameter();getInitParameterNames(); getServletContext();
获得系统时间: System.currentTimeMillis();filterConfig.getServletContext().log("Getting out ofSimpleFilter2");11、聊天程序的业务
要求使用Servlet编写聊天程序完成如下功能:用户通过在一个文本框中输入发送的消息后点击命令按钮参与聊天用户应能够使用中文聊天UserServlet 生成用户界面接受用户输入昵称
MainServlet读出 Servlet上下文中保存的用户列表向量,如果向量为null,则新建一个向量,并在用户列表向量中添加用户
UserList显示所有的聊天用户
DisplayServlet 显示所有的聊天消息
MessageServlet显示了一个文本框和一个命令按钮,以输入要通过聊天应用程序发送的消息
使用request.setCharacterEncoding(“GBK”)处理中文The sixth Lesson ---- 监听器对特定类的特定对象的一些行为进行监控,监听器是以接口形式出现的,使用它时就需去实现接口1. web.xml的配置
<listener>
<listener-class>webbook.chapter14.CounterListener</listener-class>
</listener>2. HttpSessionListener 监听器 :sessionCreated(); ---一个用户session对象产生时调用 sessionDestroyed() ; ----一个session对象销毁是调用;3. HttpSessionAttributeListener 监听器 :attributeAdded();---当会话对象来绑定新的属性(第一次调用时)时调用 attributeReplaced();--- 当一个属性被替换及更新时调用attributeRemoved();
当一个属性被移除时调用4. HttpSessionBindingListener 监听器 不需要配置 写在实体类中 :valueBound(); ---valueUnbound(); ---
调用机制:如果一个类实现了HttpSessionBindingListener接口,则这个类的对象通过session.setAttribute()被绑定到Session对象中时,则该对象的valueBound()方法被自动调用,当这个实体对象从session中删除时(调用session.invalidate()和session.removeAttribute()方法,或session对象过期)valueUnbound方法将被自动调用5. HttpSessionActivationListener监听器:sessionDidActivate();---session对象的活化后调用的方法sessionWillPassivate();----
session对象的钝化前调用的方法
活化(Activate): 通过反序列化重新加载到web容器中 与 钝化(Passivate):暂时通过序列化保存到硬盘中一般少用6. ServletContextListener 监听器 :contextInitialized(); --- 被部署时调用及启动服务器就会自动调用 contextDestroyed(); ---- web容器销毁web应用时 如关闭服务器 调用7.SevletContextAttributeListener 监听器:attributeAdded();attributeReplaced();
attributeRemoved();8. ServletRequestListener 监听器: requestInitialized();requestDestroyed();9. ServletRequestAttributeListener 监听器 : attributeAdded();attributeReplaced(); attributeRemoved();监听器的检测事件:某个特定对象被创建或删除 ; 这个对象增加属性及属性更新 或 移除属性时 会自动调用方法
The seventh Lesson ---- ajax 初深
1. Ajax 是 Asynchronous JavaScript And XML 及 异步JavaScript和XMLCss+div2. 其核心是异步发送请求,进行静态页面的刷新 失去焦点事件处理函数3. 使用四步曲一是要获取XMLHttpRequest对象 写于jsp页面的javascript函数中:var xmlrequest;
function createXMLHttpRequest()if(window.XMLHttpRequest)//是判断客户端浏览器是不是火狐之类的浏览器xmlrequest=new XMLHttpRequest();
}else if(window.ActiveXObject)//判断浏览器是不是IE浏览器try{
xmlrequest=new ActiveXObject("Msxml2.XMLHTTP");
}catch(e)try{
xmlrequest=newActiveXObject("Microsoft.XMLHTTP");--涉及网络http协议,服务器
}catch(e)}}二是要写进行哪个表单的事件处理 写于jsp页面的javascript函数中:function checkUsername(name) //文本框失去光标时,判断用户名是否存在createXMLHttpRequest();//先创建XMLHttpRequest对象
url="checkUser.do?name="+name;
url=encodeURI(encodeURI(url));//对url地址做编码,有效避免乱码的出现
// alert(url);
xmlrequest.open("get", url,true);xmlrequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//onreadystatechange可以看做是一个事件,这个事件会在request对象的等待状态被改变的时候触发
xmlrequest.onreadystatechange=processResponse;//processResponse是我们自己写的一个回调函数的名字
xmlrequest.send(null); //如果是post方式,可将传递的参数"name="+name;放于此括号中
}三是要写处理响应的回调函数 写于jsp页面的javascript函数中:function processResponse()//获得服务器给客户端的响应内容if(xmlrequest.readyState==4)// alert(xmlrequest.status);
//200表示响应处理成功 404 页面找不到 500服务器错误
if(xmlrequest.status==200)document.getElementByIdx_x("usernameDiv").innerHTML=xmlrequest.responseText;}elsedocument.getElementByIdx_x("usernameDiv").innerHTML="请稍后";}
}四是要在Servlet文件中处理通过使用ajax传递过来的值:request.setCharacterEncoding("UTF-8");
String name= request.getParameter("name");
name=URLDecoder.decode(name, "UTF-8");//解码
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
if("tom".equals(name))
out.println("您的名字已存在");
else
out.println("您的名字可用");4. XMLHttpRequest的方法及属性abort();停止发送请求
getAllResponseHeader();获取服务器返回的响应头
open("method",url,flag,username,pwd)建立与服务器的连接
Send(Content)发送请求
setRequestHeader(key,value)设置请求头
onreadystatechange:用于指定XMLHTTPRequest状态改变时的回调函数
readyState:XMLHttpRequest对象的处理状态status服务器返回的状态码,只有服务器的响应以将完成时,才会有
statusText:服务器返回的状态文本信息。只有当服务器的响应已经完成时。才会有
resonseText 服务器发回的响应文本
responseXML:获取服务器响应的XML文档对象5. XMLHttpRequest对象的处理状态:0: 没有完成初始化
1: 开始发送请求
2:对象的请求发送完成
3:开始读取服务器的响应
4: 对象读取服务器响应结束The Eighth Lesson -- 使用ajax将数据库中数据转换成xml的读取
在Servlet中:
1.将响应设置成xml:response.setContentType("text/xml;charset=utf-8");
2. 将数据使用StringBuffer拼接成xml格式的字符串sb: StringBuffer sb=newStringBuffer("<?xml version="1.0"encoding="UTF-8"?>"); --转义符的使用
3.将sb输出的浏览器: out.print(sb); --ajax进行回调,因此不需要有重定向语句
在浏览器端的script的回调函数中:
var doc = xmlrequest.responseXML; --获得服务端响应的xml文件
var cityList = doc.getElementsByTagName_r("city"); --获得节点名为<city>的所有节点返回数组
var idNode = cityList[i].getElementsByTagName_r("id")[0]; --因为知道名为id的节点只有一个
var id=idNode.text --只适应ie类型浏览器 id = idNode.textContent 只适应火狐类型浏览器id=idNode.firstChild.nodeValue; -- 两者皆可,细分了,多了一个文本节点