Html
1、属性 align:对齐方式
 bgcolor:背景颜色
target:
_blank在新窗口打开 _self默认,在相同的框架打开
_parent在父框架集中打开 _top在整个窗口打开
framename在指定的窗口打开



2、注释 <!-- 注释 -->



3、文件路径 同一目录下:文件名
 上级目录:../
 下级目录: 从目标文件开始的文件目录



4、表格 tr行、td列、th表头

<table border="1" align="center" width="80%" bordercolor="green" cellspacing="0"  cellpadding="10pt"><!—cellpadding代表文字和行之间的距离-->
 <caption>学生成绩表</caption>
 <tr><th>姓名</th><th>年龄</th><th>成绩</th></tr>
 <tr><td>张三</td><td rowspan="2">21</td><td>34</td></tr>
 <tr><td>李四</td><td>56</td></tr>
 <tr><td colspan="3">王五</td></tr><!—colspan代表列合并,rowspan代表行合并 -->
 </table>


5、表单form
表单域input
 type:text文本框、password密码、radio单选按钮、checkbox:复选框
     是否需要在本书再版时立即通知您:
     <input type="radio" checked="true">是
     <input type="radio">否
     submit提交按钮、reset重置按钮、button普通按钮
     <input type="submit" value="提交">
     hidden隐藏域(用来传送数据,不安全)
file:文件上传(两个条件:method=”post”、enctype=”multipart/form-data”)
 name:表单域的名字
 value:表单域的初始值
 size:表单元素的长度,只适用于text、password
 maxlength:表单元素中可以输入的最大字符数,只适用于text、password
 checked:boolean属性,指定按钮是否是被选中的,只适用于radio、checkbox
 readonly:只读的,只适用于text,数据能提交到后台
 disabled:表示表单域不能用,数据不能提交到后台
多行文本textarea

<textarea cols=”20” rows=”5”></textarea>//表示可以输入5行20列
 下拉列表框select
  <select name=”city” multiple>//可以选中多项
  <option value=”beijing”>北京</option>
  <option value=”shanghai”>上海</option>
  <option value=”qingdao” selected=”true”>青岛</option>//默认选中
 </select>
 域容器fieldset
  <fieldset style=”width:200”>
   <legend align=”left”>小标题</legend>
   用户名:<input type=”text”>
   密码:<input type=”password”>
 </fieldset>

6、框架frame
 frameset:分割窗口
rows分割行cols分割列
  frameborder:是否显示框架,0不显示、1显示,默认为1
  framespacing:框架间的间距
 frame:框架
  src:指定框架显示的HTML文件的位置
  noresize:设置不可以调整窗口的大小
  bordercolor:框架边框的颜色

<frameset rows=”10%,80%,*”>
  <frame src=”header.html” noresize>
  <frameset cols=”20%,*”>
   <frame src=”left.html” noresize>
   <frame src=”table.html” noresize name=”right”>
  </frameset>
  <frame src=”footer.html” noresize>
 </frameset>
 <noframes>
  <body>浏览器版本较低,请升级后访问</body>
 </noframes>


  marginwidth:窗口内的内容与窗口左右边缘的距离
  marginheigth:窗口内的内容与窗口上下边缘的距离
  scrolling:是否显示滚动条,no-不显示、yes-显示、auto-默认 自动设置
 noframes不支持框架的浏览器
  注意:<body></body>标签与<frameset></frameset>标签不能同时使用,不过,如果添加包含一段文本的
   <noframes>标签,就必须将这一段文字嵌套于<body></body>标签内
  



 JavaScript
1、增强代码可读性
<--  JavaScript代码 //-->



2、语法结构
 1)大小写敏感
 2)一句话结束最好加;
 3)注释 //  /**/
 4)弱类型



3、变量命名
 1)以字母、下划线_或美元符号$开头
 2)余下的字符可以是字母、下划线_或美元符号$、数字
 3)最长为255个字符
 4)不能有空格、大小写敏感
 5)不能使用JavaScript中的关键字或者保留字命名



4、JS变量类型
 Undefined:未定义的类型、String、Boolean、Null、Number五种
 可以使用typeof(object)来获取变量类型



5、声明 var 变量名[=初始值]
 var i = 10;
 var j;
 alert(typeof(i));//判断i的类型 number
 docement.write(123);



6、类型转换
 字符串>数值>布尔值 低级与高级相加,强制转换成高级的
 字符串数值
 parseInt()、parseFloat()、Number()



7、运算符
 算术运算符 +、-、*、/、%、++、--(前置先自增再运算、后置先运算后自增)
 比较运算符 ==、>、>=、<、<=、!=
 逻辑运算符 &&、||、!非
 赋值运算符 =、+=、-=、*=、/=



8、try{}catch(){}
 try{var a=c}catch(e){alert(e);}



9、Array数组
 var arr = new Array();//大小不固定
 var arr1 = new Array(5);//大小固定
 var arr2 = new Array(“abc”,12,23,”aaa”);//直接赋值
 
 //数组遍历for循环
 for(var i=0;i<arr2.length;i++){
  document.write(arr2[i]);
 }
 //数组遍历for each循环(注意:i代表的是索引,不是数值)
for(var i in arr2){
  document.write(arr2[i]);
}
数组方法:
1) concat()拼接数组
2) reverse()反转数组
3) join(间隔符) 返回字符串,由间隔符将所有元素连接到一起
4) pop()移除数组中的最后一个元素,并返回这个最后元素
5) shift()移除数组中的第一个元素,并返回这个元素
6) push()给数组添加新元素,并返回数组的新长度
7) slice()截取数组,返回一个新数组
8) sort()返回一个排序后的新数组//先排数组再排字母,先排十位再排个位
9) toString()返回逗号分隔的字符串
代码示例:
document.write(arr3.join(":"));// 56:32:10:4:bbb:aaa:3
document.write(arr3.push("zzz"));//8
document.write(arr3.sort().toString());//10,3,32,4,56,aaa,bbb,zzz


10、Date日期,月份是0-11
 var date = new Date();//创建当前日期对象
 var date = new Date(1970,6,12);//1970年7月12日
 var date = new Date(1970,6,12,15,3,23);//1970年7月12日15时3分23秒
 var date = new Date(‘1970/6/12’);//1970年6月12日



 日期方法:
1) toLocaleString()//将时间格式转换成字符串Monday, March 13, 2017 14:28:35



2) toLocaleDateString()//将时间格式转换成字符串,返回日期Monday, March 13, 2017
3) toLocaleTimeString()//将时间格式转换成字符串,返回时间14:28:35
4) toGMTString()//使用GMT标准时间将Date转换成字符串Mon, 13 Mar 2017 06:28:35 GMT
5) getTime()//返回毫秒数
6) getMonth()//返回当月号数,比实际小1
7) getDate()//返回当日号数
8) getDay()//返回星期几
9) getHours()、getMinutes()、getSeconds()//返回小时、分钟、秒数
10)setYear()、setMonth()...//设置时间
11) Date.parse("2014/12/12")//用日期字符串表示自1970年1月1日以来的毫秒数
12)Date.UTC(1995,11,12,11,23,24)//返回自1970年1月1日以来的毫秒数



11、Math
 1)Math.round()//四舍五入
 2)Math.ceil()//向上取整
 3)Math.floor()//向下取整
 4)Math.sqrt()//取平方根
 5)Math.random()//[0,1)之间的随机小数
 6)with(Math){document.write(round(2.5))};//在with语句体内,任何对变量的引用



12、String字符串
 var sname = “string of text”;
 var sname = new String(“stirng of text”);
 
 字符串方法:
1) length;//返回字符串长度,不是length()和java不一样
2) charAt(i);//返回指定索引处的字符
3) concat(str);//连接字符串
4) indexOf(str);//返回String对象内第一次出现字符串的字符位置lastIndexOf();
5) replace(str1,str2);//将str1替换成str2
6) slice(start,end);//返回字符串中起始位置为start,结束位置为end(不包括end)的字符串
7) split(separator,limit);//将字符串以separator作为分隔符切割,返回一个数组,有limit参数,则返回数组的limit个元素
8) substr(start,length);//返回一个从指定位置开始的指定长度的字符串
9) substring(start,end);//返回一个指定位置之间的字符串,不包括end
10) toUpperCase();//转换成大写字母



13、window对象
 window.moveBy(20,20);//将窗口向右向下移动20像素
 window.moveTo(0,0);//将窗口移动到左上角
 window.resizeBy(15,20);//将窗口相对增大15,20
 window.resizeTo(450,350);//将窗口大小改为450*350
 
window.open(url,新窗口名字,特性字符串);//打开新窗口
特性字符串:height、width、location=no没有地址栏、status=no状态栏
  var winObj = open(“house,jpg”,”house_1”,”width=500,height=300,scrollbars=no”);



14、弹出对话框
1) confirm(“确认删除吗?”);确认对话框,返回布尔值
2) alert();提示框
3) prompt(“请输入您的名字”,“admin初始值”);输入信息对话框,返回值为输入的字符串



15、定时执行
 1)setTimeout(函数名,时间间隔,重复次数),多用于递归调用
  var timeld = setTimeout(“hello()”,2000);
  clearTimeout(timeld);//清除设置的setTimeout函数
 2)setInterval(函数名,时间间隔)
  var timeld = setInterval(“hello()”,2000);
  clearInterval(timeld);



16、history对象
 1)history.go(-3);//向后返回三个访问过的页面
 2)back();//与history.go(-1)功能相同
 3)forward();//与history.go(1)功能相同



17、location对象
 location.href = “about:blank”;//清空页面



18、navigator对象
 提供用户使用的浏览器及操作系统等信息
 navigator.mimeTypes[n].type



19、screen对象获取用户屏幕信息
 width、availWidth可用宽度、colorDepth当前颜色设置所用的位数


20、document对象
 forms页面中所有表单的集合
  document.forms[0].name.value;//获取值
 images页面中所有图像的集合
 links页面中所有链接的集合
 anchors页面中所有锚的集合



 document.getElementById(Id)//获得指定Id对象
 document.getElementsByName(Name)//获得指定Name对象的集合


21、事件处理
 onBlur 当前元素失去焦点时触发
 onFouse 当某个元素获得焦点时触发
 onClick 鼠标点击时触发
 onDbClick 鼠标双击时触发
 onMouseDown 按下鼠标时触发
 onMouseMove 鼠标移动时触发
 onMouseOut 鼠标离开某对象范围时触发
 onMouseOver 鼠标移到某对象范围的上方时触发
 onKeyPress 键盘上的某个键被按下并且释放时触发

<input type="button" οnclick="myfunction('Hello')" value="Call function">
   <script language="javascript">
 function myfunction(txt){
 alert(txt);
 }
 </script>



22、表单元素
 通用属性:
  – form属性----获取该表单域所属的表单
– name属性----获取或设置表单域的名称
– type属性----获取表单域的类型
– value属性----获取和设置表单域的值
通用方法:
 – focus方法----让表单域获得焦点
– blur方法----让表单域失去焦点
 通用事件:
onfocus,onblur,onclick,onkeydown,onkeyup,onkeypress,onmouseover,onmouseout,onmousedown,onmouseup,onchange


23、表单元素checkbox应用

<input type="checkbox" name="che1" οnclick="checkall(this)">全选
 <input type="checkbox" name="che2" οnclick="unckeck()">反选</br>
  <input type="checkbox" name="hobby">看书
 <input type="checkbox" name="hobby">运动
  <input type="checkbox" name="hobby">旅游
 <input type="checkbox" name="hobby">发呆 

 
 
function checkall(cha){
  var hobby = document.getElementsByName("hobby");
  for(var i=0;i<hobby.length;i++){
   hobby[i].checked = cha.checked;
  }
 }
 function unckeck(){
  var hobby = document.getElementsByName("hobby");
  for(var i=0;i<hobby.length;i++){
   if(hobby[i].checked==true){
    hobby[i].checked = false;
   }else{
    hobby[i].checked = true;
   }
  }
 }

24、表单验证

<form name="form1" action="for.html" method="post"  οnsubmit="return ckeckForm()">
 密码:<input type="password" name="password"  οnblur="password()"/><span id="p"></span><br/>
 </form> 

 
 
function password()
 {
  var password=document.forms[0].password.value;
  var p=document.getElementById("p");
  if(password==""|| password.length==0){
   p.innerHTML="<font color=red>密码不能为空</font>";
   return false;
  }
  if(password.length<6 || password.length>12){
   p.innerHTML="<font color=red>密码必须在6---12位之间</font>";
   document.forms[0].password.value="";
   return false;
  }
   p.innerHTML="";
   return true;
 }

25、正则表达式/^    $/
 *:0次或者多次
 ?:0次或者1次
 +:1次或者多次
 {}:集合[a-z]
 |:或者
 \d:数字
 \w:字母加数字
 举例:
验证电子邮箱地址:/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
验证固定电话:/^\d{3}-\d{8}|d{4}-\d{7}$/
验证身份证号码:/^\d{15}$|^\d{18}$|^\d{17}[xX]$/
 验证方式:

search():若找不到返回-1.如果能找到,返回下标索引
   email.search(正则表达式)
 test():返回布尔值
 正则表达式.test(email)
  if(/^\d{15}$|^\d{18}$|^\d{17}[xX]$/.test(email)==false){
   alert("身份证号码格式不正确,请重新输入");
   document.forms[0].email.value="";
   return false;
  }



servlet在服务器端运行的java程序



1、servlet的生命周期(工作原理)
 单实例多线程

1) new :当页面第一次被请求,调用构造方法,产生本Servlet唯一的实例
2) init():初始化Servlet的数据,只调用一次
3) servicer():处理请求并响应,每次请求每次调用,在生命周期调用多次
4) destroy():服务器关机重启,或者项目重新发布,只调用一次



2、Servlet步骤:
 1)编写一个Servlet

<servlet>
       <servlet-name>helloservlet1</servlet-name>
       <servlet-class>servletTest.helloservlet1</servlet-class>//通过servlet找到字节码文件位置
    </servlet>
   <servlet-mapping>
       <servlet-name>helloservlet1</servlet-name>//服务器端通过用户访问路径得到servlet的名字
       <url-pattern>/helloservlet1</url-pattern>//用户的访问路径,可以任意写如/aaa
   </servlet-mapping>


 2)发布到Tomcat服务器
  右击servers—Add and Remove—将工程添加
 3)用户访问
  访问Servlet的URL:http://ip:port/web工程名字/<url-pattern>的值
  访问HTML或者JSP页面的URL:http://ip:port/web工程名字/WebContent下的子目录的路径



3、Servlet和CGI的区别:
 Servlet:多线程,数据不安全,进程间切换比较快,效率比较高
 CGI:多进程,数据安全,进程间切换比较慢,效率比较低



4、HttpServletRequest:
 1)获取表单参数
  getParameter(表单域的名字),返回表单中value值,String
   PrintWriter out=response.getWriter();
   String name=request.getParameter("username"); 
   out.println("Welcome "+name);
  getParameterValues(表单域的名字)String[]
  当表单参数数据不完整:非空判断

String[] hobby=request.getParameterValues("hobby");
    if(hobby==null){
     out.println("NO HOBBY");
    }else{
     for(String h:hobby){
      out.println(h+"<br/>");
    }


 2)获取报头Header信息(了解)
  Enumeration  getHeaderNames()
     String        getHeader(报头名字)
     int           getIntHeader(报头名字)
    long         getDateHeader(报头名字)
    Enumeration  getHeaders(报头名字)

5、HttpServletResponse(用字节流)
 1)浏览器读取文件

response.setContentType(“application/pdf;charset=utf-8”);//浏览器打开文件的方式在tomcat-conf-web.xml中找
  FileInputStream fin = new FileInputStream(“C:\\Web\\HTML.pdf”);//浏览器读取文件的路径
  ServletOutputStream sos = response.getOutputStream();
  byte[] bt = new byte[1024];
  int len = 0;
  while((len = fin.read(bt))!=-1){
   sos.write(bs,0,count);
   sos.flush();
 }
 fin.close();
 sos.close();

2)中英文乱码问题
中文格式:
UTF-8(推荐)、GB2312、GBK、GB18030
post方式提交:
request.setCharacterEncoding(“UTF-8”);//写在输出流之前,请求时
response.setContentType(“text/html;charset=utf-8”);//响应时
   
 get方式提交:

//第一种方法:重新构造字符串(推荐)
   name = new String(name.getBytes(“ISO-8859-1”),”UTF-8”);
   //第二种方法:修改Tomcat-conf-server.xml文件,查找8080
   <Connector port=”8888” protocol=”HTTP/1.1” connectionTimeout=”20000”
   redirectPort=”8443” URIEncoding=”utf-8”/>


3)设置报头信息

setIntHeader();
   response.setIntHeader("Refresh", 2);//页面每2秒钟刷新一次
  setHeader();
   response.setHeader("Refresh", "2;url=http://www.baidu.com");//页面两秒钟后跳转到百度首页
  setDataHeader();


   页面无缓存:

response.setHeader("Pragma", "No-cache");//http1.0
    response.setHeader("Cache-Control", "no-cache");//http1.1
    response.setDateHeader("Expires", 0);//ie


 4)页面跳转(重定向和转发的区别)
  重定向:多次不同请求,地址栏发生变化,可以跳转到任意web应用下
   response.sendRedirect("http://www.baidu.com");//跳转到百度首页
   response.sendRedirect("Img");//跳转到相对路径下的Servlet页面
  转发:同一请求,地址栏不发生变化,只能在本web应用下跳转

//方式一
   RequestDispatcher rd=request.getRequestDispatcher("Img");
   rd.forward(request, response);
   //方式二,相对于java工程的路径
 this.getServletContext().getRequestDispatcher("/Img").forward(request,response); 
   //方式三
   this.getServletContext().getNamedDispatcher("Img").forward(request, response);

6、格式良好的web应用:
WEB-INF:客户端禁止访问,服务器端可以访问,禁止通过URL访问
class目录:字节码文件
lib目录:第三方的jar包
web.xml文件:配置信息



可以转发访问放在WEB-INF下的文件,不可以重定向访问,因为重定向访问经过地址栏,相当于客户端的访问,放在
 WEB-INF下的文件只能通过服务器端访问,不能通过客户端访问
RequestDispatcher rd = request.getRequestDispatcher(“WEB-INF/hello.html”);
rd.forward(request,response);


7、配置文件web.xml

<servlet></servlet>中的语句
  <load-on-startup>10</load-on-startup>//servlet加载的顺序,数值越小越先加载
   举例:
 <servlet>
       <servlet-name>HelloWordservlet1</servlet-name>
       <servlet-class>servletTest.helloservlet1</servlet-class>//通过servlet找到字节码文件位置
    <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet>
       <servlet-name>Helloservlet1</servlet-name>
       <servlet-class>servletTest.helloservlet1</servlet-class>//通过servlet找到字节码文件位置
     <load-on-startup>2</load-on-startup>
  </servlet>
  servlet-name:Servlet名字
  servlet-class:Servlet的完整路径名
  url-pattern:用户访问路径
 <url-pattern>*.do</url-pattern>//访问路径可以自己设置,说明任意路径+.do及可以访问页面
  init-param:初始化参数(了解写在一个<servlet></servlet>中),只能在本Servlet中使用,只能在init方法中调用,通过ServletConfig的getInitParameter()方法获取参数的值
  context-param(了解与<servlet></servlet>并列):所有的Servlet均可以使用,任何方法中都可以调用,通过ServletContext的getInitParameter()方法获取参数的值,一般放数据库的参数;
 <context-param>
 <param-name>driver</param-name>
 <param-value>oracle.jdbc.driver.OracleDriver</param-value>
 </context-param>
 protected void doGet(HttpServletRequest request, HttpServletResponse response){
  String driver=this.getServletContext().getInitParameter("driver");
  System.out.println("driver:"+driver);
 }


 错误信息友好页面的处理

<error-page>
   <error-code>404</error-code>//错误码404路径错误、500空指针错误
   <location>/404.jsp</location>
   </error-page>
   <error-page>
   <exception-type>java.lang.ArithmeticException</exception-type>//错误信息的处理
   <location>/exception.jsp</location>
   </error-page>


 exception.jsp文件中写

<body>
 <h1>
 Error!            
                             
                </h1>
   </body>

8、打包 .war包
 jar –cvf 包名.war*



9、过滤器Filter
 过滤器的生命周期
1) new Tomcat服务器一启动的时候产生过滤器对象
2) init()初始化参数数据,只调用一次
3) doFilter()每次请求每次调用
4) destroy()只调用一次,服务器关机重启等之前
过滤器的实现步骤(与在web.xml中的书写顺序有关,请求时123,响应时321)

<filter>
      <filter-name>MyFilter</filter-name>
      <filter-class>WebXml.Servlet.MyFilter</filter-class>//过滤器路径
   </filter>
    <filter-mapping>
       <filter-name>MyFilter</filter-name>
      <url-pattern>/*</url-pattern>//过滤的文件类型,过滤所有文件,*.html过滤所有html文件
 </filter-mapping>


chain方法必须在doFilter方法中实现
  System.out.println("doFilter2...");//请求时执行
  chain.doFilter(request, response);//调用下一个过滤器或者资源
 System.out.println(2);//响应时执行
过滤器的应用(中英文乱码问题)
  在doFilter方法中写下方代码即可
  HttpServletRequest  request=(HttpServletRequest)req;//转换格式
  HttpServletResponse  response=(HttpServletResponse)res;
  request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
  chain.doFilter(request, response);
Servlet要是安全的,实现SingleThreadModel接口,该接口已过时,面试时会问



10、Servlet状态管理:
 http协议:无状态
 客户端状态管理:数据不安全,减轻了服务器的负担
  Cookie:最多4kb
   永久性cookie:setMaxAge(int seconds)
   暂时性cookie(默认):浏览器关闭就消失
  隐藏域hidden
  查询字符串:get方式提交 ? &

PrintWriter out = response.getWriter();
   Cookie[] cooks = request.getCookies(); 

 
 
  if(cooks==null){
    for(int i=0;i<5;i++){
     Cookie cookie = new Cookie("cookieName:"+i,"cookieValue"+i);
     cookie.setMaxAge(24*3600);
     response.addCookie(cookie);
    }
    out.println("<h1>Set Cookies OK</h1>");
   }else{
    out.println("<table border=\"1\" align=\"center\" width=\"80%\" cellspacing=\"0\">");
    out.println("<tr><th>cookieName</th><th>cookieValue</th></tr>");
    for(int i=0;i<5;i++){   out.println("<tr><td>"+cooks[i].getName()+"</td><td>"+cooks[i].getValue()+"</td></tr>");
    }
    out.println("</table>");


 服务器端状态管理:数据安全,加重了服务器的负担

HttpServletRequest:同一请求范围内有效,转发可以读取,重定向不可以,因为重定向不是同一个request对象
    setAttribute(String name,Object obj);//存储数据
    getAttribute(String name);//读取数据
    removeAttribute(String name);//删除数据
  getAttributeNames(String name);


 代码举例:

request.setAttribute("username", "admin");//<==>String username="admin" ;
  request.getRequestDispatcher("ShowRequestAttribute").forward(request, response);
  ShowRequestAttribute文件代码
    PrintWriter out = response.getWriter();
    String username = (String) request.getAttribute("username");
  out.println("<font color=\"pink\">username:"+username+"</font>");
 HttpSession同一会话范围内有效


Session工作原理:
客户端发送请求,服务器端为客户创建一个session对象,服务器通过cookie返回一个sessionId给客户端,以后客户端再次发送请求带着sessionId,服务器端根据发送过来的sessionId返回session对象



getSession()与getSession(boolean)的区别:

1)getSession();与getSession(true)相同,如果现在已有session对象,使用已有的session对象,如果没有session对象,则新建一个
 2)getSession(boolean); getSession(false) 如果现在已有session对象,使用已有的session对象,如果没有session对象,则返回null
  一般通过暂时性cookie将sessionId送到客户端,但是客户端浏览器禁止cookie,则需要通过URL重写
  Servlet线程安全:实现SingleThreadModel接口
   encodeURL(String url);
   encodeRedirectURL(String url);//重定向的重写
   PrintWriter out = response.getWriter();
   HttpSession session = request.getSession();
   out.println("<h1>Session Info</h1>");
   out.println("isNew:"+session.isNew()+"<br/>");
   out.println("SessionId:"+session.getId()+"<br/>");
   out.println("CreateTime:"+session.getCreationTime()+"<br/>");
   out.println("CreateTime:"+new Date(session.getCreationTime())+"<br/>");
   out.println("LastAccessedTime:"+new Date(session.getLastAccessedTime())+"<br/>");
   out.println("<br/>");
   out.println("<h1>Request Sessioninfo</h1>");
   out.println("SessionId:"+request.getRequestedSessionId()+"<br/>");
   out.println("FromCookie:"+request.isRequestedSessionIdFromCookie()+"<br/>");
   out.println("FromURL:"+request.isRequestedSessionIdFromURL()+"<br/>");
   out.println("isValid:"+request.isRequestedSessionIdValid()+"<br/>");
   out.println("<a href="+request.getRequestURI()+">test</a><br/>");
 out.println("<a href="+response.encodeURL(request.getRequestURI())+">URL</a><br/>");
    session的会话时长:
 1) setMaxInactiveInterval(int interval)//秒
 2) tomcat服务器的web.xml
 <session-config>
   <session-timeout>30</session-timeout>//分钟
 </session-config>
    session对象的销毁
 1) 会话自然过期
 2) invalidate()立即销毁session对象;注销时能用到
 3) 关闭浏览器,sessionId马上销毁,但是session对象仍然会在服务器端存活一段时间
 session中存储的数据:同一个会话范围内有效
 SetAttribute(String name,Object obj);存储数据
 getAttribute(String name);读取数据
 removeAttribute(String name);删除数据
 getAttributeNames();
 ServletContext:所有用户共享,并且与web应用有相同的生命周期,做在线人数统计
   response.setContentType("text/html;charset=utf-8");
   PrintWriter out=response.getWriter();
   ServletContext application=this.getServletContext();
   Integer count=(Integer)application.getAttribute("count");
   if(count==null){
    application.setAttribute("count", 1);
   }else{
    count++;
    application.setAttribute("count", count);
   }
   out.println("在线人数为:"+application.getAttribute("count"));

JSP(java Server page)Java服务器页面 1、 Servlet:看做是嵌入HTML标签的类(数据的控制)
JSP:看做是嵌入Java代码的HTML(数据的显示)



2、 JSP的工作原理:
当页面第一次被请求时,把Java代码转换成Servlet,然后响应回去,之后请求,如果页面没有变化,直接响应就可以,如果Servlet发生变化,再请求时,重新转换成Servlet,然后再响应



3、 JSP转换将文件放在Tomcat的work文件下


4、 JSP的经典语法:
注释:<%-- --%>浏览器不可见
  <!-- -->查看源文件,浏览器可见
声明:<%! %>声明方法和成员变量
脚本段:<% %>句子和局部变量,如if循环语句
表达式:<%= score %>输出到浏览器,等价于<%out.println();%>
指令:<%@ %>
迭代语句:跨脚本段 遇到Java代码跳入脚本段,遇到HTML标签跳出脚本段
普通语句

<%
 int score=12;
 if(score==100){
   out.println("<h1><font color=\"red\">去公园玩</font></h1>");
 }else{
   out.println("<h1><font color=\"blue\">在家反省</font></h1>");
 }
 %>
 迭代语句
 <%
 int score=100;
 if(score==100){
 %>
 <h1><font color="red">去公园玩</font></h1>
 <%
 }
 else{
 %>
 <h1><font color="blue">在家反省</font></h1>
 <%} %>



5、page指令  设置当前页面的信息
language:语言
contentType:设置当前页面的编码格式,默认为ISO-8859-1
pageEncoding:设置当前页面的编码格式,默认为ISO-8859-1
import:导包 可以出现多次,如果写在一个import中,中间用逗号间隔
session:当前页面是否有session对象,默认为true
extends:JSP页面生成的Servlet类的父类
buffer:表示缓冲器大小,默认8kb
autoFlush:默认为true是否自动刷新缓冲区
isThreadSafe:是否是线程安全的,默认为true
isELIgnored:默认为false不忽略,是否忽略EL表达式
isErrorPage:默认为false,页面是否为错误页面
errorPage:后面跟错误页面的URL路径

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" buffer="1kb" import="java.sql.Connection" autoFlush="false" isELIgnored="false"%>


6、include指令
  include指令(静态包含)与include动作(动态包含)的区别
  include指令:只转换成一个Servlet,转换成Servlet时就包含进来,不可以使用表达式
  <%@include file=”header.jsp”%>
  include动作:转换成多个Servlet,响应时包含进来,可以使用表达式
  <jsp:include page=”<%=header.jsp%>”></jsp:include>



7、taglib指令JSP三个指令:page、include、taglib


8、JNDI:数据库连接池
在web应用下的META-INF下新建context.xml配置文件

<?xml version=”1.0” encoding=”UTF-8”?>//告诉我们是一个xml文件
 <Context>
 <Resourse  name=”jdbc/mysourse”      
 auth=”Container”  
    type=”javax.sql.DataSourse”
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    url=” jdbc:oracle:thin:@YLMF123-3131857:1521:orcl”
    username=”scott”
    password=”tiger”
    maxActive=”30”
    maxIdle=”5”
    maxWait=”10000”
  />
 </Context>
 //name表示Resourse资源的JNDI的名字
 //auth表示这个资源的管理者Application(web应用创建和管理Resourse)、Container(容器创建和管理Resourse)
 //type表示Resourse所属的Java类
 //maxActive数据库在此服务器上打开的最大连接数
 //maxIdle数据库在此服务器上打开的最小连接数
 //maxWait最大的等待时间,毫秒
 使用:
 Context context=new InitialContext();
 DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/mysource");
 conn=ds.getConnection();


9、jsp下的转发

<jsp:forword></ jsp:forword>


10、jsp的9个内置对象
 1)request       HttpServletRequest
 request.getAttribute(“”);
 request.getParameter(“”);
 2)response      HttpServletResponse
 response.sendRedirect(“”);
 response.encodeURL(“”);
 response.getWriter();
 3)session       HttpSession
  session.setAttribute(“”);
 4)application  ServletContext
  application.setAttribute(“”,””);
  application.getAttribute(“”);
 5)config        ServletConfig
  config.getInitParameter(“”);
 6)out 默认值为null         JspWriter
 7)page 默认值为this,指的是当前Servlet       Object    
  8)exception    Throwable是一个类,与exception是继承关系
  9)pageContext PageContext
   pageContext:
1) 产生其他内置对象
2) 存储page作用域范围内的数据,以及其他作用域(request、session、application)范围内的数据
10、JSP四个领域范围(作用域范围)
 1)page:当前页面有效
 2)request:同一请求范围内有效
 3)session:同一会话范围内有效
 4)application:web应用范围内有效



11、JavaBean:是一种规范,是一种可移植的组件


12、成为JavaBean的规范
 1)必须是公开类
 2)必须是无参的构造方法
 3)属性xxx必须是getXxx或者SetXxx命名
 4)实现Serializable接口
 5)该bean放在某个包中(前三个条件必须满足)
 程序如下:

public class Users implements Serializable{
 private int id;
 private String username123;
 private String password;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getUsername() {
  return username123;
 }
 public void setUsername(String username) {
  this.username123 = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
  }


13、用jsp对bean进行赋值和输出

<jsp:useBean>相当于new一个对象
 <jsp:setProperty>赋值
 <jsp:getProperty>取值
 程序如下:
 <body>
 <jsp:useBean id="u" class="com.neusoft.bean.Users" scope="session"></jsp:useBean>
 <jsp:setProperty property="*" name="u" />
 //属性的名字应与表单域中的name相同,可以用*通配符
 //否则用以下代码
 <jsp:setProperty property="id" name="u" param="id"/>//相当于u.setId(12);
 <jsp:setProperty property="username" name="u"  param="name"/>
 <jsp:setProperty property="password" name="u"  param="pwd"/>
 Id:<jsp:getProperty property="id" name="u"/><br/><!-- u.getId() -->
 Name:<jsp:getProperty property="username" name="u"/><br>
 Password:<jsp:getProperty property="password" name="u"/>
 </body>


14、EL表达式:通常与JSTL一起使用
1)语法:${} 花括号里面可以使用.或者[]
 如:${requestScope.user.id }
2)有些情况必须使用[]:数组、List集合、Map集合、变量中有特殊字符(如na$me需要用[“na$me”])
数组:${requestScope.arr[1] }<br>
List集合:${requestScope.list[0].username }<br>
Map集合:${requestScope.map["m2"].password}
3)el的隐含语法:

<%=request.getParameter("name") %>//取表单域的值
 ${param.name }//取表单域的值
 ${header.host }//获得报头信息,主机名字
 ${cookie }//获得cookie
 4)运算符:+、-、*、/(div)、%(mod)
  ${18 div 10} //输出1
  ${2==4} //false  
  ${2<4 && 5>3} //true



15、JSTL(JSP Standard Tag Library)标签库
1)导包:

在WEB-INF的lib导入standard-1.1.2.jar包(现成的)
 在jar包下的META-INF的c.tld找到uid路径,复制粘贴到
 <%@taglib uri=”复制” prefix=”c”%>


2)out 标签 输出

<body>
 <jsp:useBean id="user" class="com.neusoft.el.User" scope="request"></jsp:useBean>
 <jsp:setProperty property="id" name="user" value="12"/>
 <jsp:setProperty property="username" name="user" value="abc"/>
 <jsp:setProperty property="password" name="user" value="123"/>
 <!-- out标签 -->
 <c:out value="admin"></c:out>
 EL表达式:${requestScope.user.password }
 out标签:<c:out value="${requestScope.user.password }"></c:out>
 default属性:<c:out value="${name}" default="qqq"></c:out>
 //value对象存在,即输出,不存在即返回default设置的默认值
 <%
 String str="<address>";//xml标签
 request.setAttribute("str", str);
 %>
 //是否屏蔽xml标签,默认值为true,即屏蔽
 escapeXml标签:<c:out value="${str }"   escapeXml="false"></c:out>
 </body>
3)set标签 声明变量
 <c:set var=”u” value=”guest” scope=”session”></c:set>
  Set标签:${sessionScope.u}//输出guest
  //针对JavaBean的属性,target指的是JavaBean的id
  <c:set target=”${user}” property=”username” value=”John”></c:set>
  ${user.username}
4)remove标签 删除
  <c:remove var=”u”>
5)if标签 判断,只能放一条if语句
  <c:set var=”age” value=”2300” scope=”request”></c:set>
  <c:if test=”{${age<0 || age>200}”>年龄不合法</c:if>
6)choose标签 多条件判断
  <c:choose>
  <c:when test=”${age<0 || age>250}”>年龄不合法</c:when>
  <c:when test=”${age<50 || age>250}”>中年人</c:when>
  <c:otherwise>老年人</c:otherwise>
  </c:choose>
7)forEach标签 遍历数组、集合
  //item:集合的名字
  //var:遍历集合是所遍历到的元素的名字
  //begin=“1” end=“4”部分遍历
  //step 步长值 默认为1
  //varStatus 状态值变量 index下标 count第几个元素
  <!—遍历数组 -->
  <c:forEach items=”${arr}” var=”item” varStatus=”aa”>
  ${item}||${aa.index}||${aa.count}||${aa.first}||${aa.last}
  </c:forEach>
  <!-- 遍历List集合 -->
  <c:forEach items=”${list}” var=”item”>
  ${item.id}||${item.username}//list集合里面是user对象
  </c:forEach>
  <!-- 遍历Map集合 -->
  <c:forEach>
 ${item.key}||${item.value.username}//value是user对象
  </c:forEach>


16、MVC架构模式(可重用性、可维护性)
发送请求,Servlet(属于控制层)负责处理请求,jsp只负责显示(属于View视图层),JavaBean负责逻辑部分
M(JavaBean):数据的逻辑,与数据库的交互逻辑(dao层和service层)
V(jsp):数据的显示
C(Servlet):数据的控制
a. 处理请求
b. 根据请求,找到某个业务逻辑处理
c. 根据业务逻辑的结果,找到某个视图响应回去



Ajax(Asynchronous JavaScript And XML) 1、步骤

var xmlhttp;
 function val{  1)获取表单数据
 var username = document.getElementsByName(“username”)[0];//得到一个数组
2)创建XMLHttpRequest对象
 if(window.XMLHttpRequest){//除了ie7以下版本,浏览器中都有XMLHttpRequest对象,如火狐、搜狗等
  xmlhttp  = new XMLHeepRequest();
 }else if(window.ActiveXObject){//ie6,ie6.5
  xmlhttp = new ActiveXObject(“Microsoft.XMLHTTP”);
 }
3)建立与服务器的连接
 if(xmlhttp){//判断是否创建成功
 xmlhttp.onreadystatechange = callback;//注意后面不加括号,设置状态变化时调用callback方法
 xmlhttp.open(“GET”,”GetServlet?,true);
 //method:提交方式,URL:提交到的目标页面,async:是否异步(true表示异步)
 //POST方式提交
 xmlhttp.open(“POST”,”POSTServlet”,true);
 xmlhttp.setRequestHeader(“Content-Type”);
 xmlhttp.send(“username=”+username.value);
4)发送请求
 xmlhttp.send(null);
 }
 }
5)编写回调函数,用于存储服务器响应回来的数据
 function callback(){
  if(xmlhttp.readystate==4){
 if(xmlhttp.status==200){
 var text = xmlhttp.responseText;//获取服务器的数据
    var s = document.getElementById(“s”);
    s.innerHTML = “<font color=red>”+text+”</font>”;
 }
 }
 }


2、XML可扩展的标记性语言
格式良好的XML文件
1) 大小写敏感
2) 标签要求正确嵌套
3) 属性值必须被“”修饰
4) 标签必须成对出现
5) 必须要有根元素<?xml version=”1.0”?>



3、DOM(Document Object Model):文档对象模型