####1.动态网页开发基础#### 

 ##1.1配置tomcat服务器 

1.1.1使用tomcat服务器(需配置环境变量JAVA_HOME) 

1.打开bin/startup.dat文件 

2.配置域名conf/server.xml文件下配置 

3.使用myeclipse打开tomcat:http://localhost:8080/javaweb/MyHtml.html 

1.preferences-tomcat-Tomcat 7.x选择tomcat路径(enable) 

2.window-show view-servers 

3.servers-tomcat 7.x-add deployment(将当前项目部署到tomcat目录下) 

4.servers-tomcat 7.x-run servers 

5.http://localhost:8080/javaweb/MyHtml.html 

6.文件创建在WebRoot下 

1.1.2使用命令行运行tomcat 

F:\apache-tomcat-7.0.82\bin\startup.bat 

1.1.3使用server.eml修改tomcat端口号 

1.1.4jsp页面元素 

<% %> 编写java代码 

<%= %> 表达式 相当于out.print();输出执行结果 

<%! %> 声明方法,声明全局变量 

1.1.5jsp注释 

<!-- html注释 --> 

<%-- jsp注释 --> 

<%//单行注释--> 

<% /* 多行注释 */> 

####2.jsp数据交互#### 

##2.1jsp内置对象## 

2.1.1out对象   
用于向客户端输出数据 

out.print();向ui界面输出 

out.write();作为想网页输出html代码块 

2.1.2request对象 
 用于处理客户端请求的数据信息 

方法名称 
 说明 

String getParameter(String name) 
 根据页面表单组件名称获取页面提交数据 

String[] getParameterValues(String name) 
 根据一组以相同名称命名的表单组件提交的数据 

void setCharacterEncoding(String charest) 
 指定每个请求的编码,在调用getParameter方法之前进行设定,可以用于解决中文乱码的问题 

RequestDispatcher getRequestDispatcher(String path) 
返回一个对象,该对象forward()方法用于转发请求//工程文件不需要写在路径中 

web页面中路径如何去写:要项目名的时候给浏览器用如重定向,不要项目名的时候给服务器使用如转发 

2.1.3response对象 
 用于响应客户端请求并向客户端输出信息 

方法名称 
 说明 

void addCookic(Cookie cookie) 
 向客户端添加Cookie 

void setContentType(String type) 
 设置HTTP相应的contentType类型 

void setCharacterEncoding(String charest) 
 设置响应所采用的字符编码类型 

void sendRedirect(String location) 
 将请求重新定位到一个新的URL上 
 需要设置状态属性 
 out.write("<script>location.href='地址'</script>")//重定向跳转页面 

    //2.转发,地址栏没变,因为只请求一次 

request.setAttribute("message", message); 

request.getRequestDispatcher("/demo/demo2.jsp").forward(request, response); 

登录过滤 

if(session.getAttribute("petstore")==null){ 

response.sendRedirect("/pet_store/ui/login.jsp"); 

return ; 

} 

2.1.4session对象 
 用于记录会话状态的相关信息,在服务器中 

方法名称 
说明 

String getId() 
 获取sessionid 

void setMaxInactiveInterval(int interval) 
 设定session的非活动时间 

int getMaxInactiveInterval() 
 获取session的有效非活动时间,以秒为单位 

void invalidate() 
 设置session对象失效 

void setAttribute(String key,Object value) 
 以key/value的形式将对象保存到session中 

Object getAttribute(String key) 
 通过key获取session中保存的对象 

void removeAttribute(String key) 
 从session中删除指定key对应的对象 

//如果服务器当中有这个用户的session那么就是获得,否则就是创建 

在前面需要有session=“false“ 

HttpSession session=request.getSession(); 

转换 
 URLEncoder.encode("哈哈", "utf-8"); 

不适用cookie而使用session对象 

cookie的数据保存在客户端,不安全 

cookie保存中文需要特殊处理 

cookie在浏览器当中存储有上限 

2.1.5include指令 

<%@ include file="应用文件路径" %>    //不需要项目名 

2.1.6cookie对象 

客户端存储技术,cookie数据是保存在客户端的 

Cookie cookie=new Cookie("key","value"); 

response.addCookie(cookie); 

cookie.setMaxAge(60*60); 

response.addCookie(cookie); 

//cookie.setPath("");//设置路径 

Cookie[] cookies=request.getCookies(); 

####3.jsp数据交互(二)#### 

 ##3.1内置对象application 
 类似于系统的全局变量,用于实现web应用中的资源共享 

方法名称 

void setAttribute(String key,Object value) 
 以key/value的形式将对象存储到application中 

Object getAttribute(String key) 
 通过key获取application中存储的对象 

String getRealPath(String path) 
 返回相对路径的真实路径 

 ##其他内置对象 

pageContext:提供了在jsp运行时访问和其相关的环境信息的能力,通过pageContext对象可以访问和当前jsp页面相关联的所有作用域,以及一些页面属性 

常用方法 
 说明 

ServletRequest getRequest() 
 获取request对象 

ServletResponse getResponse() 
 获取response对象 

HttpSession getSession() 
 获取session对象 

JspWriter getOut() 
 获取out对象 

void setAttribute() 
 保存属性 

Object getAttribute() 
 获取属性 

void include() 
 请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中 

  page:表示当前页面, 

  config:用于存放jsp编译后的初始数据 

  exception:表示jsp页面运行时产生的异常和错误信息,该对象只有在错误页面(page指定中设定isErrorPage为true的页面)中才能使用 



  四个域对象 

  pagecontext:只在本页面中存储和获取 

  request:一次请求中,只能转发 

  session:一次会话 

  application:服务器不关闭将永远存在 

 ##el表达式 

当一个页面中传递一个域如request.setAttribute("key",对象),另一个页面可以用${key.属性}来接收如${key.name} 

当url中传递数据时,可以用${param.name},但是不可添加变量 

el表达式可以用于运算,三元运算符,empty(判断是否为空)${!empty 对象} 



if(false){ 

}else{ 

//注册失败,数据回显到注册页面 

request.setAttribute("name", "张三"); 

request.setAttribute("sex", "女"); 

//模拟 

} 

<!-- 概念:数据回显 

好比:修改--你一点修改回去修改ui让你修改数据,而这个ui会展现原始数据 

好比:注册失败--你注册失败会回到注册页面,而这个注册页面还有有你上一次的数据 

什么是回显?有数据就提取展现出来,没数据就不显示  if else if 

--> 

<input type="text" name="user" value="${name}"/> 

男:<input type="radio" value="男" 

name="sex" ${sex=='男'?'checked':'' }/> 

女:<input type="radio" value="女" 

name="sex" sex=='女' ? 'checked':'' }/> 

${pageContext.request.contextPath}//获得项目名 

${list[0].name } 

<c:set var="key" value="<h1>哈</h1>" scope="request"></c:set> 

<c:out value="${key }" escapeXml="false"></c:out> 

我们常会用c标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行、偶数行差异;最后一行特殊处理等等。先就varStatus属性常用参数总结下: 

${status.index}      输出行号,从0开始。 

${status.count}      输出行号,从1开始。 

${status.current}   当前这次迭代的(集合中的)项 

${status.first}  判断当前项是否为集合中的第一项,返回值为true或false 

${status.last}   判断当前项是否为集合中的最后一项,返回值为true或false 

begin、end、step分别表示:起始序号,结束序号,跳跃步伐。 



 ##使用jstl配合el表达式 

隐式对象:requestScope,pageScope,sessionScope,allicationScope 

当一个页面传递集合的时候,另一个页面需要导入jstl.jar和standard.jar包然后 

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:forEach items="${topics}" var="xx" varStatus="state"> 

${xx.tid}${xx.tname} ${state.count} 

</c:forEach>在本页面中操作时,需要把集合中的内容放到域中 

1.if.....elseif...else... 

<c:choose> 

<c:when test=""></c:when> 

<c:when test=""></c:when> 

<c:otherwise></c:otherwise> 

</c:choose> 

2.request.removeAttribute()相当于 

<c:remove var="key" scope="request"/> 

3.重定向跳转页面 

context写的是父路径 

<c:redirect url="" context="${pageContext.request.contextPaht}"></c:redirect> 

####4.使用分层实现业务处理#### 

 ##4.1JNDI 

JNDI的全称是java命名与目录接口 

在tomcat中conf\context.xml文件下配置 

<Environment name="tjndi" value="hello jndi" type="java.lang.String"/> 

在jsp中写入 

<%@page import="javax.naming.InitialContext"%> 

<%@page import="javax.naming.Context"%> 

Context ctx=new InitialContext(); 

String testjndi=(String)ctx.lookup("java:comp/env/tjndi"); 

out.print(testjndi); 

####6.servlet#### 

##1.配置servlet##继承HttpServlet类 

  * servlet==java类==动态网页资源技术 

  * GenricServlet实现了servlet接口 

  写一个类继承了GenericServlet并调出一些方法:destroy,init,service 

  在WebContent-WEB-INF下配置出web。xml文件 

  <!-- 设置session在服务器端存活的有效期 --> 

 <session-config> 

 <session-timeout>10</session-timeout> 

 </session-config> 

 <!-- 映射 将服务器中的firstServlet这个资源和一个url关联映射--> 

 <servlet> 

 <servlet-name>cj</servlet-name> 

 <!-- control包下的FirstServlet的class文件 --> 

 <servlet-class>control.FirstServlet</servlet-class> 

 </servlet> 



 <servlet-mapping> 

 <servlet-name>cj</servlet-name> 

 <url-pattern>/first</url-pattern> 

 </servlet-mapping> 



1.1servlet是单实例多线程, 

 生命周期 

 1.创建对象--第一次被访问 

 2.init初始化--第一次访问 

 3.service调用--每一次访问 

 4.destroy方法--服务器结束 

 HttpServlet的service方法内部判断请求来源,如果是get就调用get方法,如果是post就调用post方法 



   1.2 使用新建生成servlet方法,生成doGet和doPost方法,然后在其doGet()方法中输入以下代码 

  
 //设置tomcat的数据为utf-8,传递给浏览器 

response.setCharacterEncoding("utf-8"); 

//设置浏览器的数据格式为html,编码格式为utf-8 

response.setContentType("text/html;charset=utf-8");//当输出到网页上的内容是图片的时候写img/png 

在servlet中使用jsp重定向的时候需要加项目名,如form表单数据 

@WebServlet("/petStoreControl")//使用注解@WebServlet(value="/upload",loadOnStartup=1) 

PrintWriter out=response.getWriter();//获取out对象 

out.write("<h1>我</h1>"); 

ServletContext application = request.getServletContext();//获取application对象 

HttpSession session=request.getSession;//获取session对象 

1.3 
 MVC+三层架构 

jsp(ui--view) 

+servlet(control--control) 

+javaBean(model--entity+dao+service) 

####7.实现分页业务逻辑#### 

7.1使用查询语句limit来获取结果集,在javaBean中写一个专门用来做分页功能的类,如pageBean,属性有总页数,当前页,结果集,长度 

具体代码实现在11-25 

 ##7.2文件传输## 

1.在form表单上添加enctype="multipart/form-data"//在表单中必须给input添加name属性 

//导入commons-iojar和commons-fileuploadjar 

String userName=request.getParameter("userName"); 

//使用jar包去完成获取文件 

//1.创建FileItemFactory对象 

FileItemFactory factory=new DiskFileItemFactory(); 

//2.创建ServletFileUpload对象 

ServletFileUpload upload=new ServletFileUpload(factory); 

upload.setHeaderEncoding("utf-8"); 

//3.解析form表单提交的所有表单元素 

List<FileItem> fileItems=null; 

try { 

fileItems=upload.parseRequest(request); 

} catch (FileUploadException e) { 

// TODO Auto-generated catch block 

e.printStackTrace(); 

} 

if(fileItems!=null) { 

for (FileItem fileItem : fileItems) { 

if(fileItem.isFormField()) { 

//4.如果是普通的元素,获取该元素的名和值使用, 

System.out.println("表单元素的名字"+fileItem.getFieldName()); 

System.out.println(fileItem.getString("utf-8")); 

}else { 

//5.如果是文件数据,获取文件名的等参数 

String fileName=fileItem.getName(); 

//以输入流的形式获取 

InputStream in=fileItem.getInputStream(); 

//创建一个本地文件输出流,将用户传递的流信息保存起来 

String path=request.getServletContext().getRealPath("/WEB-INF/upload");//request.getContextPath()获取项目名 

System.out.println(path); 

//6.保存文件数据到服务器 

FileOutputStream out=new FileOutputStream(path+"/"+fileName); 

byte[] b=new byte[1024]; 

int line=0; 

while((line=in.read(b))!=-1) { 

out.write(b,0,line); 

} 

in.close(); 

out.close(); 

//删除临时文件:因为服务器会吧用户上传的文件偷偷的给你创建一个临时文件 

fileItem.delete(); 

} 

} 

} 

下载 

int id=Integer.parseInt(req.getParameter("id")); 

//委托业务层做下载 

File file=new File(1,"笔记1.txt",req.getServletContext().getRealPath("/WEB-INF/upload/笔记1.txt"));//这个是实体类 

/** 

* 设置一个响应头,告诉浏览器,请以下载文件方式接收我的响应,,而不是当做text、html展示给用户看 

*/ 

//中文必须用urlEncoding编码 

resp.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getFileName(), "utf-8")); 

FileInputStream in=new FileInputStream(file.getFilePath()); 

//getWriter想页面输出文本,同理可以输出文件流 

OutputStream out=resp.getOutputStream(); 

int line=0; 

byte[]b=new byte[1024]; 

while((line=in.read(b))!=-1) { 

out.write(b,0,line); 

} 

####8.过滤器和监听器#### 

 ##8.1过滤器## 

response.getWriter().write("<script></script>"); 

使用注解@WebFilter(urlPatterns= {"/index.jsp","/file"}) 

8.1.1生命周期 

实现servlet包下的filter 

1.创建     在服务器启动的时候被创建,只被实例化一次 

2.初始化 
 在实例化过滤器时会调用init()方法来实现初始化操作,init()方法主要设计用于使过滤器为处理做准备 

3.执行过滤,调用doFilter()方法执行过滤器定义的功能 

4.销毁 
 调用destroy()方法,该方法给过滤器以清除其持有的资源的机会 

FilterChain.doFilter(Servletrequest, Servletresponse) 

过滤器常用的范围是:日志记录,改善性能,安全与会话管理,敏感字过滤 

 ##8.2过滤器的定义和使用 

解决乱码问题,降低开发成本,提高工作效率 

1.定义过滤器 

实现Filter接口,在java.servlet包下 

request.setCharacterEncoding("utf-8"); 

response.setContentType("text/html;charset=utf-8"); 

//解决mthod=post时的中文乱码 

response.setCharacterEncoding("utf-8"); 

filter.doFilter(request, response); 

解决method=get时候的中文乱码 

if(((HttpServletRequest)request).getMethod().equals("get")){ 

value=new String(value.getBytes("iso-8859-1"),"utf-8");} 

2.过滤链 

一个目标资源可以被多个过滤器去过滤 

顺序:如果用xml方式配置过滤器--从上往下 

 如果是注解按照文件名大小 

装饰设计模式:23种设计模式之一,解决的问题:对一个对象进行增强,出现在io流框架体系中 

例如创建一个类Singer类,有一个sing()方法 

创建一个包装类,写一个构造方法把Singer对象传进来,给设置一个private Singer对象,在其方法里写此对象的方法 

 ##8.3监听器## 

监听器接口 
 说明 

javax.servlet.ServletContextListener 
 实现该接口可以在Servlet上下文对象初始化或者销毁时得到通知 

javax.servlet.ServletContextAttributeListener 
 实现该接口可以在Servlet上下文对象的属性列表发生变化时得到通知 

javax.servlet.http.HttpSessionListener 
 实现该接口可以在session创建后或者失效前得到通知 

javax.servlet.http.HttpSessionActivationListener 
 实现该接口的对象如果绑定到session中,当session被钝化或者激活时,Servlet容器将通知该对象 

javax.servlet.http.HttpSessionAttributeListener 
 实现该接口可以在session中的属性列表发生变化时得到通知 

javax.servlet.http.HttpSessionBindingListener 
 实现该接口的对象在绑定session或者从session中删除时会得到通知 

javax.servlet.ServletRequestListener 
 实现该接口可以在请求对象初始化时或者销毁时得到通知 

javax.servlet.ServletRequestAttribute 
 实现该接口可以在请求对象中的属性发生变化时得到通知 

在application中可以利用其特性,将页面不常用的可存储,提高带宽 

 可以利用销毁来实现同时在线数量 HttpSession session=req.getSession(); 

session.setMaxInactiveInterval(30); 

注意使用注解 

感知型监听器 

实体类继承HttpSessionBindingListener,当在session中添加该实体类时,触发 valueBound(HttpSessionBindingEvent arg0),移除时触发valueUnbound(HttpSessionBindingEvent arg0) 

当另一台电脑访问当前电脑时,可以写ip地址去访问部署在Tomcat的文件 

 ##8.4钝化和活化## 

钝化在META-INF下创建一个context.xml文件 

写入<?xml version="1.0" encoding="UTF-8"?> 

<Context> 

<Manager className="org.apache.catalina.session.PersistentManager" 

maxIdleSwap="1"> 

<Store className="org.apache.catalina.session.FileStore" 

directory="d:/session/" /> 

</Manager> 



</Context> 

<!-- 

减轻服务器压力: 

长时间处于空闲状态session但是有没有超过30分钟,把他从服务器缓存当中移到本地文件当中去(钝化) 

下一次访问在反序列化将session再活化到内存当中为用户服务。 

没有服务器:将web应用托管到     阿里云, 百度云 ,新浪云 

一个服务器:应用服务器+数据库服务器:localhost改成数据库服务器的ip地址 

负载均衡:多台应用服务器 :Ningx 

--> 

并将实体类序列化,在将该实体类传入session中时,将触发如果在规定时间内不对该操作时,将在d:session下创建一个文件,保存该信息, 

减轻服务器的负担 

####9.ajax#### 

html页面使用jq编写ajax 

$("#userName").blur(function(){ 

var userName=$(this).val(); 

$.ajax({ 

"url":"/12-01/first", 

"data":"userName="+userName,//null 

"type":"get", 

"success":function(data){ 

if(data=="true"){ 

alert("可以使用"); 

}else{ 

alert("重名了"); 

} 

} 

}); 

}) 

servlet中 

//验证 

String userName=req.getParameter("userName"); 

System.out.println(userName); 

String result="true"; 

//调用业务层方法 

if("zy".equals(userName)) { 

result="false"; 

System.out.println("sdfsdaf"); 

} 

resp.getWriter().write(result); 

 ##9.1XMLHttpRequest## 

9.1.1创建XMLHttpRequest对象 

老版本 

XMLHttpRequest=new ActiveXObject("Microsoft.XMLHTTP"); 

新版本 

XMLHttpRequest=new XMLHttpRequest(); 

9.1.2常用的属性和方法 

方法名称 
 说明 

open(String method,String url,boolean async,String user,String password) 
 用于创建一个新的HTTP请求 

参数method:设置HTTP请求方式,如get,post 

参数url:请求的url地址 

参数async:可选,指定次请求是否为异步方法,默认为true 

参数user:可选,如果服务器需要验证,此处需要指定用户名,否则会弹出验证窗口 

参数pssword:可选,验证信息的密码,如果用户名为空,此值将被忽略 



send(String data) 
 发送请求到服务器端 

参数data:字符串类型,通过次请求发送的数据,此参数值取决于open方法中的 

method参数,如果是post,可以指定该参数,如果是get,该参数为null 



abort() 
  取消当前请求 



setRequestHeader(String header,String value) 
 单独设置请求的某个HTTP头信息 

参数header:要指定的HTTP头名称 

参数value:要指定的HTTP头名称对应的值 



GetResponseHeader(String header) 
 从响应中获取指定的HTTP头信息,参数header:要指定的HTTP头 



GetAllResponseHeaders() 
 获取响应的所有的HTTP头信息 



属性名称 
 说明 

onreadystatechange 
 设置回调函数 

readyState 
  返回请求的当前状态 

常用值:0----未初始化 

1----开始发送请求 

2----请求发送完成 

3----开始读取响应 

4----读取响应结束 

status 
  返回当前请求的HTTP状态码 

常用值:200----正确返回 

404----找不到访问对象 

statusText 
  返回当前请求的响应行状态 

responseText 
  以文本形式获取响应值 

responseXML 
  以XML形式获取响应值,并且解析成DOM对象返回 

 ##9.2定义json对象 

语法:var 
JSON对象={name:value,name:value.....}; 

JSON数据以名/值对的格式书写,name必须是字符串由双引号阔起来,value可以是String,Number,boolean,null,对象,数组 



 ##9.3使用jQuery实现ajax 

9.3.1$.ajax()方法 

参数 
 类型 
 说明 

url 
 String 
 发送请求的地址,默认为当前页地址 

type 
 String 
 请求方式(post或Get,默认为Get),1.9.0之后使用method代替ytpe 

data 
 String或PlainObject或Array 
 发送到服务器的数据 

dataType 
  String 
 预期服务器返回的数据类型,可用的类型有XML,HTML,Script,JSON,Text 



beforeSend 
  Function(jqXHR jqxhr,PlainObject settings) 
 发送请求前调用的函数,可用于设置请求头等,返回false将终止请求 

参数jqxhr:可选,jaxhr是XMLHttpRequest的超集 

参数settings:可选,当前ajax()方法的settings对象 



success 
  Function(任意类型 result,String textStatus,jqXHR jqxhr)请求成功后调用的函数 

参数result:可选,由服务器返回的数据 

参数textStatus:可选,描述请求状态的字符串 

参数jqxhr:可选 



error 
 Function(jqXHR jqxhr,String textStatus,String errorThrown)   请求失败时被调用的函数 

参数jqxhr:可选 

参数textStatus:可选,错误信息 

参数errorThrown:可选,文本描述的HTTP状态 



complete 
  Function(jqXHR jqxhr,String textStatus) 
 请求完成后调用的函数 

参数jqxhr:可选 

参数textStatus:可选,描述请求的HTTP状态 



timeout 
  Number 
   设置请求超时时间 

global 
  Boolean 
 默认为true,表示是否触发全局Ajax事件 









$(":button").click(function(){ 

//将表单数据变成字符串 userName=xx&password=yy 

var formData=$("form").serialize(); 

//alert(formData); 

//登录验证 

$.ajax({ 

url:"/12-01/login", 

data:formData, 

type:"post", 

dataType:"json", 

success:function(data){ 

if(data=="true"){ 

console.log("登录成功"); 

location.href="/12-01/html/index.html"; 

}else{ 

console.log(data); 

data=jQuery.parseJSON(data); 

console.log(data); 

for(var i in data){//i是下标,是属性名 

console.log(data[i]); 

document.write(data[i].id+data[i].name+data[i].date); 

} 

} 

}, 

error:function(e){ 

console.log(e); 

} 

}) 

})