Servlet
基本概念:
1. 什么是Web?Web有什么用?
2. 什么是Web服务器?Web Server?
3. Web Server的作用?
4. 发展历史?
5. 什么是CGI?
6. Servlet的出现
7. Servlet的作用?
8. Web Server和Servlet的交互
9. Servlet API
什么是Web?Web有什么用?:
Web就是网络,一个大的网络,是由n个服务器和客户端组成的的计算机网络,有了这个网络,就可以实现各个计算机之间的通信
什么是Web服务器?Web Server?
在web这个网络中,有一些计算机承担主管的作用,很多的信息都放到一个或者多个电脑中,其他计算机如果想要这些信息,那么需要到主管这里请示,然后主管回复他们,这个主管就是web服务器,也就是Web Server,它一般是只两个意思,一个是硬件是服务器,另一个是软件是服务器,比如在硬件服务器上装上服务器端的软件,Tomcat等,它的好处就在于通用
Web Server的作用?
1. 负责各个计算机的通信 Socket
2. 线程,处理并发,多个计算机(多用户)与服务器通信的能力 Socket
3. 特定的协议
发现问题:如果自己架设个Web Server是不容易实现,需要做大量的工作,设计制作Web Server是由系统程序员使用c/c++开发的
发展历史?
专用服务器: 例如:QQ,MSN,需要在客户端装软件,程序员需要开发客户端程序
Web时代:互联网上用户需要客户端,程序员只需要在通用服务器上进行二次开发,例如:开发个网站等等,用户在客户端上只装个通用的客户端就行(BrowBer浏览器),这样就可以用很多的基于Web Server平台开发的程序,非常的方便
Web Server:1.使用80端口 2.业务层协议:http
BrowBer:浏览器,如IE
什么是CGI?
如果我们需要做个通用的软件,那么在Web Server平台上进行二次开发,这个工作是由应用程序员来做,我们使用的是JAVA
如果在Web Server平台上进行二次开发,需要使用一些技术,如:CGI,Servlet等
什么是CGI?
公共网关接口,工作方式:请求-响应 特点:1.无连接,请求-响应-断开连接 2.http协议
为什么要使用http协议呢?如果是有限连接,由于大量的客户端要进行访问,所以资源不够,所以使用http协议无连接的方式,解决了大量客户端访问服务器的问题
CGI就是Web Server上的Web组件,它不能离开Web Server这个平台
Web Server相当于一个容器,运行环境,Web组件在这个平台上工作
CGI的作用:1.采取了一个工作方式:请求-响应(无连接)实现通信功能 2.完成业务计算
Servlet的出现:
CGI的问题:CGI是一个独立的进程,进行工作的,进程和进程间的通信不大容易实现,比较复杂
客户端—请求(request)—web server—交给CGI(独立进程)做业务计算—返回给web server—响应(reponse)—客户端
web server通过ipc为CGI提交服务,这样是比较困难的
JAVAEE规范:Servlet替代CGI
两者的区别:1.Servlet用java写的,CGI用c/c++写的 2.Servlet是多线程的,CGI是多进程的,多线程比多进程好实现 3.Servlet是常驻内存的,效率高
Servlet的作用?
工作在web server之上,完成业务计算,以请求响应的方式完成特定的工作
Web Server和Servlet的交互:
Web Server的容器提供一些公共的对象,给Servlet来使用
Servlet组件API,容器回调这些API
Servlet API:
容器回掉的API:
init():给Servlet做初始化的
Service(request):将请求的信息作为参数传递给Servlet
Destroy():卸载方法
从容器中读取Servlet信息的API:
GetServletconfig():得到Servlet的配置信息
GetServletinfc():得到Servlet的配置信息
搭建Web Server环境(TomCat)
1.需要的资源
2.搭建过程
3.TomCat目录结构
需要的资源:
1.TomCat5.5:下载地址:http://jakarta.apache.org/builds/ 本地:servlet/三个压缩包
2.JDK1.5
搭建过程:
1.安装JDK1.5,设置path,x:/jdk1.5/bin
2. 设置CLASSPATH
3.解压缩TomCat
4.设置JAVA_HOME:x:/jdk1.5
5.设置CATALINA_HOME:x:/tomcat
6.测试:运行tomcat/bin/startup.bat,在浏览器中输入:http://localhost:8080/
TomCat目录结构:
/bin:Tomcat的命令脚本文件
/conf:存放TomCat服务器的各种配置文件,重要的配置文件是server.xml
/server:包含三个子目录:classes,lib,webapps
/server/lib:存放TomCat服务器需要的各种jar文件
/server/webapps:存放服务器自带的两个web应用程序:admin和manager
/common/lib:存放服务器和所有web应用都可以访问的jar文件
/shared/lib:存放所有web应用都可以访问的jar文件
/logs:TomCat的日志文件
/webapps:将web应用放到这里
/work:TomCat把jsp生成的servlet放到这个目录下
第一个web应用:
Web应用目标:
在浏览器上显示hello word!
1.TomCat服务器功能
2.Web应用程序目录结构
3.使用servlet api 创建一个web应用
4.写web.xml将url和类绑定,以便让用户输入url就能找到类
5.部署servlet类文件
TomCat服务器功能:
1.主界面说明:
Status:服务器状态
TomCat Administration:服务器管理员(控制平台)
TomCat Manager:应用程序管理员(管理平台)
Documentation:文档(servlet,jsp的api文档等)
Examples:例子
2.添加用户:
修改H:/tomcat/conf/tomcat-users.xml文件
3.应用程序管理界面(TomCat Manager):
列出了所有的web应用的状态,可以对web应用进行状态的设置,如:启动,关闭,删除等等
List Applications:web server的容器
HTML Manager help:帮助文档
Manager help:帮助
Server status:服务器状态
Path:web应用程序的URL
Display Name:应用程序的名字
Running:应用程序的运行情况
Session:会话,有几个连接着应用程序
Commands:命令:Reload(刷新web组件,重启)Undeploy:卸载
两种发布web应用的方式:
第一:发布webapps目录下的web应用
第二:发布位于任何位置的WAR文件
例如:web应用:hello.war 1。将它放在webapps里,选择第一种方式 2。放在任意位置,使用第二种方法
测试:http://localhost:8080/hello/index.htm
4.修改端口号:
Conf/Server.xml 70多行处修改端口号,修改后重启TomCat
Web应用程序目录结构:
Web应用具有特定的目录结构
例如:创建helloapp的web应用
/webapps目录:建立helloapp目录
/helloapp目录:web的根目录,所有的jsp,html文件都放到这里(也可以再建立目录)
/helloapp/pages目录:html文件
/helloapp/js目录:JavaScript
/helloapp/pice目录:gif
/helloapp/WEB-INF目录:存放web应用的发布描述文件web.xml
/helloapp/WEB-INF/classes目录:存放各种类文件,包括servlet类文件
/helloapp/WEB-INF/lib目录:存放该web应用所需要的jar文件,例如:JDBCjar包
Web程序运行的时候,TomCat的类加载器先装载classes中的类文件,然后装载lib下的文件
/helloapp/WEB-INF/src目录:存放.java文件
使用servlet api 创建一个web应用:
CLASSPATH:tomcat/common/lib/servlet-api.jar(因为jdk没有servlet的包)
/**
* 程序目标:
* 这个web应用的目的是让servlet响应一个信息,helloword!给容器
* 容器响应给浏览器,最终将helloword!显示在浏览器上
* 程序过程:
* 用户在浏览器上输入web应用的url(请求),web应用的服务器
* 也就是tomcat,他将这个请求告诉给servlet,servlet进行业务计算
* servlet打了个hello word!返回给容器,容器再将这个信息返回给
* 用户
* 问题:
* 1。servlet类的写法?
* 2。web.xml的写法?为什么要写web.xml?
* servlet类的写法:
* 1。倒入javax.servlet包
* 2。实现Servlet接口
* 3。必须至少有一个service方法,这个方法负责和容器交流
* 4。写上必要的方法:如:初始化的
* 为什么要写web.xml:
* web应用程序有url和servlet类的名字,那么如何通过url找到相应
* 的类呢?那就需要将它们映射起来,web.xml就是起这个作用
*/
import javax.servlet.*;
import java.io.*;
public class Hello implements Servlet{
public void service(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException{
PrintWriter pw=response.getWriter();
pw.print("<h1>hello word!</h1>");
}
public void init(ServletConfig config)throws ServletException{}
public void destroy(){}
public java.lang.String getServletInfo(){return "";}
public ServletConfig getServletConfig(){return null;}
}
写web.xml将url和类绑定,以便让用户输入url就能找到类:
1.应用程序的名字:<display-name>Hello app</display-name>
2.Servlet类名字:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>Hello</servlet-class>
</servlet>
3.Servlet类和一个url映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Hello app</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>
部署servlet类文件:
1.设置classpath:导入servlet-api.jar包
2.编译servlet类,并将.class文件拷到/WEB-INF/classes目录中
最后,在浏览器中输入:http://127.0.0.1/helloapp/yuchen
语法格式为:127.0.0.1/web应用url/url
使用Servlet子类创建Servlet类
1.Http和HttpServlet类
2.使用HttpServlet类的Servlet类(两个例子)
3.带包名的类的部署方法
4.Servlet处理表单
5.浏览器不能正常显示html页面 (看例3)
6.Html文件放到子文件夹下的部署方法 (看例3)
Http和HttpServlet类:
1。什么是http?有什么用?
基于请求/响应的协议,web server和浏览器通过http在internet上发送和接收消息
2.http请求
由三个部分组成:请求的方法uri协议和版本,请求头,请求正文(包含查询字符串)
3.http响应
由三个部分组成:协议状态代码描述,响应头,响应正文(html页面)
4.HttpServlet的作用?
负责根据用户发送的请求来响应并返回结果给容器,servlet容器读取Http请求,然后将这些内容打包到HttpRequest对象中,这样减轻了HttpServlet的工作量,现在只要调用HttpServletRequest的一些方法就能处理请求信息了,所以,httpServlet的作用就是得到http请求并作出响应并返回结果给容器的
5.HttpServletRequest的常用方法
getCookies():得到http请求中的Cookies
getHeader(String name):得到参数指定的http请求中的Header数据
getRequestURI():得到http请求中的URI
getQueryString():得到http请求中的查询字符串
getMethod():得到http请求中所使用的方法
6.HttpServletResponse的常用方法
addCookie(Cookie cookie):向http响应里加入Cookie
setHeader(String name,String value):设置http响应的Header
addHeader(String name,String value):向http响应加入Header
使用HttpServlet类的Servlet类(两个例子):
使用httpServlet类的好处在于,它是个抽象类,可以只写必要的方法
要么重写service方法,要么写dopost()和doget()方法,因为,dopost和doget这两个方法会从父类中了解到用户使用的请求方法,根据用户的请求方法调用对应的dopost或者doget,所以,如果不但写了这两个方法还重写了service方法,重写的service方法就失去了判断用户请求方法的功能
例1
web应用
名字:httpServlet
目录结构:
根目录:
/httpServlet
/httpServlet/JS
/httpServlet/pages
/httpServlet/pice
/httpServlet/WEB-INF : web.xml
/WEB-INF/classes : 类包名/TestHttpServlet1.class
/WEB-INF/lib
/WEB-INF/src : TestHttpServlet1.java
http://127.0.0.1/httpServlet/yc2
Java文件
/**
* 知识点:
* 使用HttpServlet的web应用
* 程序目标:
* 使用HttpServlet的方式响应一个hello world!
* 优点:
* 不用写那么多方法了
*/
package httpServlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class TestHttpServlet1 extends HttpServlet{
public void service(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException{
PrintWriter pw=response.getWriter();
pw.print("<h1>hello word!</h1>");
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>httpServlet</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>httpServlet.TestHttpServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/yc2</url-pattern>
</servlet-mapping>
</web-app>
例2
web应用
名字:dgetANDdpost
目录结构:
根目录:
/dgetANDdpost
/dgetANDdpost/JS
/dgetANDdpost/pages
/dgetANDdpost/pice
/dgetANDdpost/WEB-INF : web.xml
/WEB-INF/classes : 类包名/TestMethod.class
/WEB-INF/lib
/WEB-INF/src : TestMethod.java
http://127.0.0.1/dgetANDdpost/yc3
java文件
/**
* 知识点:
* 使用HttpServlet的web应用:doGet and doPost方法
* 父类中的service方法会从请求来的数据中辨别使用的是什么请求方法,根据
* 请求方法,会调用相对应的HttpServlet中的方法(doget或者是dopost)
* 1.什么是post?什么是get?
* post用于请求中含有表单数据,不能使用url方式
* get:url方式请求的属于get,也可以用在表单上
* 程序目标:
* 使用HttpServlet的方式响应一个hello world!
*/
package dgetANDdpost;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class TestMethod extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
PrintWriter pw=response.getWriter();//通过response得到输出流
pw.print("<h1>hello word! get()</h1>");
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
PrintWriter pw=response.getWriter();
pw.print("<h1>hello word! post()</h1>");
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>dgetANDdpost</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>dgetANDdpost.TestMethod</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/yc3</url-pattern>
</servlet-mapping>
</web-app>
带包名的类的部署方法:
上面两个例子中的Servlet类都是带包名的,需要改两个地方
1.web.xml:类名需要加上包的名字
2.classes目录下的class文件要创建包文件夹,如果是使用javac –d 编译好后会自动创建和包名相同的文件夹
Servlet处理表单:
例2扩展
web应用
知识点:
1.在一个web应用中使用多个servlet类
2.在一个web应用中使用多个html页面
3.当htm文件的名字为index的时候,成为该web应用的主页
4.自动识别get和post方法
5.get结果在url中有参数,查询字符串 post结果在url中没有参数
get请求既能使用url也可以使用表单 post请求只能在表单中使用
名字:dgetANDdpost
目录结构:
根目录:
/dogetANDdopost
/dgetANDdpost/JS
/dgetANDdpost/pages
/dgetANDdpost/pice : form1.htm,form2.htm
/dgetANDdpost/WEB-INF : web.xml
/WEB-INF/classes : 类包名/TestMethod.class,TestMethod2.class
/WEB-INF/lib
/WEB-INF/src : TestMethod.java,TestMethod2.java
http://127.0.0.1/dogetANDdopost/yc3 form1.htm->TestMethod.java
http://127.0.0.1/dogetANDdopost/yc4 form2.htm->TestMethod2.java
web.xml的写法:
增加<servlet>,<servlet-mapping>标签就行了
TestMethod2.java:代码和TestMethod大致一样:
不一样处:pw.print("<h1>i love you get()</h1>");
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>dgetANDdpost</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>dgetANDdpost.TestMethod</servlet-class>
</servlet>
<servlet>
<servlet-name>hello2</servlet-name>
<servlet-class>dgetANDdpost.TestMethod2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/yc3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/yc4</url-pattern>
</servlet-mapping>
</web-app>
例3
web应用
知识点:
getParameterNames():从请求中得到所有的参数名字
getParameterValues():从请求中得到所有的参数值
getParameter(String name):从请求中得到指定参数名所对应的值
解决编码问题:userName=new String(userName.getBytes("ISO-8859-1"),"GB2312");
解决不能正常显示html内容问题:response.setContentType("text/html;charset=GB2312");
Html文件放到子文件夹下的部署方法:在html文件中,action="/根目录名/url"
"/"代表http://ip:port/
程序目标:
使用上面的方法,从表单中读取参数信息,并将这些信息返回给用户
名字:formData
目录结构:
根目录:
/formData
/formData/JS
/formData/pages
/formData/pice : form1.htm
/formData/WEB-INF : web.xml
/WEB-INF/classes : 类包名/TestForm.class
/WEB-INF/lib
/WEB-INF/src : TestForm.java
http://127.0.0.1/formData/yc5 form1.htm->TestForm.java
总结HttpServlet的步骤:
1.继承HttpServlet
2.覆盖部分方法(最好不要将service,请求方法(doGet,doPost)同时覆盖)
3.读取请求信息,查询字符串,表单等,并响应一个html数据
getParameterNames():从请求中得到所有的参数名字
getParameterValues():从请求中得到所有的参数值
getParameter(String name):从请求中得到指定参数名所对应的值
4.得到输出流,并将结果发送给servlet容器
response.getWriter() print println PrintWriter
html文件
<form method="post" action="/formData/yc5">
userName:<input type="text" name="userName" />
<br>
password:<input type="password" name="password" />
<br>
<input type="submit" name="提交" />
</form>
Java文件
/**
* 知识点:
* getParameter(String name)
* html基础知识
* 编码解码
* 在浏览器上正常显示结果
* 程序目标:
* 读取提交的数据,得到参数值,并且输出成html页面,html里显示标题,正文
* 中显示参数的值
*/
package formData;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class TestForm extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
//得到指定的参数的参数值
String userName=null;
String title=null;
String body=null;
userName=request.getParameter("userName");
if(userName!=null){//编码解码
userName=new String(userName.getBytes("ISO-8859-1"),"GB2312");
}else{
userName="我的朋友";
}
title="form";
body="欢迎你来到java世界";
//在浏览器上正常显示结果
response.setContentType("text/html;charset=GB2312");
//输出到一个html页面
PrintWriter pw=response.getWriter();//通过response得到输出流
pw.print("<html><head><title>"+title+"</title></head>");
pw.println("<body>您好"+userName+"<br>");
pw.print(body+"这是get方式"+"</body></html>");
pw.close();
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
//得到指定的参数的参数值
String userName=null;
String title=null;
String body=null;
userName=request.getParameter("userName");
if(userName!=null){//编码解码
userName=new String(userName.getBytes("ISO-8859-1"),"GB2312");
}else{
userName="我的朋友";
}
title="form";
body="欢迎你来到java世界";
//在浏览器上正常显示结果
response.setContentType("text/html;charset=GB2312");
//输出到一个html页面
PrintWriter pw=response.getWriter();//通过response得到输出流
pw.print("<html><head><title>"+title+"</title></head>");
pw.println("<body>您好"+userName+"<br>");
pw.print(body+"这是post方式"+"</body></html>");
pw.close();
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>formData</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>formData.TestForm</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/yc5</url-pattern>
</servlet-mapping>
</web-app>
使用eclipse创建web项目的太慢问题的解决方法:
1.设置:Team->validation 去掉一些选项
2.Web and xml->xml catalog 添加web app2.4这个文件
Servlet生命周期:
1.初始化阶段
2.响应客户请求阶段
3.终止阶段
初始化阶段:
用户-〉请求-〉到servlet容器-〉容器创建一些对象-〉servlet调用init()方法,只被调用一次
init()
init(ServletConfig config):如果覆盖这个方法,一定要调用一下父类的这个方法,让他做一些工作,然后使用Servlet.getServletConfig()得到config,这样才能拿过来接着用
web应用
知识点:
TInit.java:将一些信息写入到日志中,从web.xml中得到servlet的初始化参数信息并返回给浏览器
1.ServletConfig对象:
servlet容器创建ServletConfig对象,并且在Servlet初始化阶段当作参数传递给init(ServletConfig)
这个方法,如果要在Servlet子类中使用ServletConfig对象,分几种情况:
第一:子类的父类如果是HttpServlet并且覆盖了init(ServletConfig config)方法,super().getServletConfig()
第二:如果没有覆盖,getServletConfig()
第三:如果实现的是接口,在init(ServletConfig)中,直接使用,因为并没有覆盖init(ServletConfig)
第四:如果实现的是接口,在其他方法中使用getServletConfig()
2.getInitParameter()从web.xml中得到初始化参数的信息
3.log写入servlet对象日志
TestInit.java:实现Servlet接口,使用config对象,并读取web.xml中的信息
TestS.java:使用线程测试destroy()方法,由于service线程不安全的,所以在里面使用共享资源需要使用同步方法
名字:life
目录结构:
根目录:
/life
/life/JS
/life/pages : lf.html
/life/pice :
/life/WEB-INF : web.xml
/WEB-INF/classes : 类包名/TestS.class,Tinit.class,TestInit.class
/WEB-INF/lib
/WEB-INF/src : TestS.java,Tinit.java,TestInit.java
http://127.0.0.1/life/lf1 lf.html->Tinit.java
http://127.0.0.1/life/lf2 TestInit.java
http://127.0.0.1/life/lf3 TestS.java
lf.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>Insert title here</title>
</head>
<body>
<form action="/life/lf1" method="get">
<input type="name" name="user"></input>
<br><input type="password" name="pwd"></input>
<br><input type="submit">
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>life</display-name>
<servlet>
<servlet-name>life1</servlet-name>
<servlet-class>life.Tinit</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>Hello World</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>life2</servlet-name>
<servlet-class>life.TestInit</servlet-class>
</servlet>
<servlet>
<servlet-name>life3</servlet-name>
<servlet-class>life.TestS</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>life1</servlet-name>
<url-pattern>/lf1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>life2</servlet-name>
<url-pattern>/lf2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>life3</servlet-name>
<url-pattern>/lf3</url-pattern>
</servlet-mapping>
</web-app>
Java文件
package life;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestInit implements Servlet{
private ServletConfig config=null;
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
config=arg0;
}
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
String info=config.getInitParameter("message");
PrintWriter out=arg1.getWriter();
out.print(info);
config.getServletContext().log("bu neng zhi jie diao log le");
out.close();
}
}
package life;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class TestS extends HttpServlet{
private int count;
private boolean end=false;
public synchronized boolean isEnd() {
return end;
}
public synchronized void setEnd(boolean end) {
this.end = end;
}
public synchronized int getCount() {
return count;
}
public synchronized void in(){
count++;
}
public synchronized void out(){
count--;
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out=arg1.getWriter();
arg1.setContentType("text/html");
in();
boolean f=true;
while(f){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("working......<br>");
out.flush();
if(this.isEnd()){
f=false;
}
}
out.print("jieshu le");
out.close();
out();
}
@Override
public void destroy() {
// TODO Auto-generated method stub
if(this.getCount()>0){
this.setEnd(true);
}
while(getCount()>0){
log(getCount()+" : "+(new Date()).toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package life;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Tinit extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//从web.xml中得到config init信息
PrintWriter out=response.getWriter();
String info=getServletConfig().getInitParameter("message");
String info2=getInitParameter("message");
out.println(info);
out.println(info2);
//写信息到日志文件
getServletConfig().getServletContext().log("labalagu");
log("zhijieyong log");
out.close();
}
}
MVC:
web应用
程序目标:
内容管理系统(实现信息的增删改查)
1.用户输入名字和密码登陆:如果是root密码是123进入用户信息列表页面
2.点add,进入添加页面,输入名字,添加到列表
3.点修改,可以对名字进行修改
4.点删除,实现对用户记录的删除
5.可以对单个用户进行信息的查询
程序逻辑:
mvc架构:login.html:用户登录后,输入名字和密码,转向c,c通过得到url判断是登录,还是修改,删除等
c将信息保存转发给服务层m,进行数据库的连接实现增删改查,将结果转发给v层
模块划分:
1.login.html:登录页面,当点登录按钮,将数据提交到c层,c层判断url,如果是/login,那么连接到m层,m层实现jdbc中的查询功能,返回给c层结果集合,c层将结果集合发送给v层,v层将结果输出到浏览器
2.用户看到list后,点add这个按钮进入到add页面,这个按钮将发送一个指向一个servlet类的url,这个servlet类是v层,用来显示add页面;v层的这个类所显示的页面中的表单,将数据递给c层,c层判断url,如果是/add.do,连接到m层进行jdbc实现,添加成功后,显示list
3.修改:list中modify链接(tomodify.do?id=?)---c层,做两件事:从id找到name(c-m-c)然后保存这个对象,c(usre/modify)---v层:显示修改页面,v层(modify.do)---c层---m层---v层(list)
4.删除:list中delete链接(delete.do?id=?)---c层:得到id,---m层:删除
sql:
1.创建数据表:create table useres ( id number(4),name varchar2(30));
2.创建sequence create sequence user_sequence;
目录结构:
根目录:
/userapp
/userapp/JS
/userapp/pages
/userapp/pice : login.htm
/userapp/WEB-INF : web.xml
/WEB-INF/classes
/WEB-INF/lib
/WEB-INF/src :
/src/userapp.ums.web:(servlet类c层和v层)ControllerServlet.java UserListServlet.java
/src/userapp.ums.util:(数据库连接工厂等)JdbcUtil.java ConnectionFactory.java
/src/userapp.ums.service:(服务层m层:jdbc实现)UserService.java
/src/userapp.ums.entity:(实体)user.java
login.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>form</title>
<script type="text/javascript">
function test(form)
{
var username=form.user;
if(username.value.length==0){
alert("please shu ru name");
form.user.value="root";
return false;
}
return true;
}
</script>
</head>
<body>
<center><h3>user login</h3></center>
<hr>
<form action="/userapp/login.do" method="post">
<table border="1" align="center" width="600">
<tr>
<td>user name:</td>
<td>
<input type="text" name="user" />
</td>
</tr>
<tr>
<td>password:</td>
<td>
<input type="password" name="pwd" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="login" οnclick="return test(this.form)"/>
<input type="reset" value="reset" />
</td>
</tr>
</table>
</form>
<center><a href="">register</a></center>
</body>
</html>
web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>servapp</display-name>
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>userapp.ums.web.ControllerServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>UserListServlet</servlet-name>
<servlet-class>userapp.ums.web.UserListServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>UserAddServlet</servlet-name>
<servlet-class>userapp.ums.web.UserAddServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>UserModifyServlet</servlet-name>
<servlet-class>userapp.ums.web.UserModifyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UserListServlet</servlet-name>
<url-pattern>/user/list</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UserAddServlet</servlet-name>
<url-pattern>/user/add</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UserModifyServlet</servlet-name>
<url-pattern>/user/modify</url-pattern>
</servlet-mapping>
</web-app>
entity包:
package userapp.ums.entity;
//用户实体
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setName(String name,int id){
this.name=name;
this.id=id;
}
}
service包:m层
/*
* 程序目标:
* 服务层(m)
* login():判断用户名和密码
* findAll():查找所有的信息
* add():将用户要插入的信息保存到数据库
* findById():查找并返回指定id的对象
* update():修改信息
* delete():删除
* nextId():sequence
*/
package userapp.ums.service;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import userapp.ums.entity.User;
import userapp.ums.util.ConnectionFactory;
import userapp.ums.util.JdbcUtil;
/*
* 服务层:
* login():判断从login.html中传来的用户名和密码
*/
public class UserService {
private List users=new ArrayList();
public User login(String username,String pwd){
if(username.equals("yuchen")&&pwd.equals("123")){
User user=new User();
user.setName("yuchen");
return user;
}
return null;
}
public Collection findAll() {
// TODO Auto-generated method stub
//jdbc
Collection users=new ArrayList();
Connection con=null;
// Statement st=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
con=ConnectionFactory.getConnection();
// st=con.createStatement();
// rs=st.executeQuery("select id,name from users");
String sql="select id,name from useres";
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
User user=new User();
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
users.add(user);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(rs,ps,con);
}
return users;
}
public void add(User user){
Connection con=null;
PreparedStatement ps=null;
try {
int id=user.getId();
String name=user.getName();
String sql="insert into useres values (?,?)";
con=ConnectionFactory.getConnection();
ps=con.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(ps, con);
}
}
public User findById(int id){
User user=null;
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
String sql="select id,name from useres where id=?";
con=ConnectionFactory.getConnection();
ps=con.prepareStatement(sql);
ps.setInt(1, id);
rs=ps.executeQuery();
if(rs.next()){
user=new User();
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(ps, con);
}
return user;
}
public void update(User user){
Connection con=null;
PreparedStatement ps=null;
try {
String sql="update useres set name=? where id=? ";
con=ConnectionFactory.getConnection();
ps=con.prepareStatement(sql);
ps.setString(1, user.getName());
ps.setInt(2, user.getId());
ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(ps, con);
}
}
public void delete(int id){
Connection con=null;
PreparedStatement ps=null;
try {
con=ConnectionFactory.getConnection();
ps=con.prepareStatement("delete from useres where id=?");
ps.setInt(1, id);
ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(ps, con);
}
}
public int nextId()
{
int nextId = -1;
Connection con = null;
Statement st = null;
ResultSet rs = null;
try
{
con = ConnectionFactory.getConnection();
st = con.createStatement();
String sql = "select user_sequence.nextval from dual";
rs = st.executeQuery(sql);
rs.next();
nextId = rs.getInt(1);
} catch (Exception e)
{
throw new RuntimeException();
} finally
{
JdbcUtil.close(rs, st, con);
}
return nextId;
}
}
util包:
package userapp.ums.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionFactory {
public static Connection getConnection() throws ClassNotFoundException, SQLException{
Class.forName("oracle.jdbc.driver.OracleDriver");
return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name","scott","tiger");
}
}
package userapp.ums.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUtil {
public static void close(ResultSet rs,Statement st,Connection con){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Statement st,Connection con){
close(null,st,con);
}
}
web包:servlet,(c and v层)
package userapp.ums.web;
/**
* c层,中央控制器:得到url,判断url,进行不同的操作
*/
import java.io.IOException;
import java.util.Collection;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import userapp.ums.entity.User;
import userapp.ums.service.UserService;
public class ControllerServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/*
* 创建服务层对象并处理并发问题
*/
UserService service=null;
synchronized(getServletContext()){
//一个servlet容器创建一个ServletContext对象
service=(UserService)getServletContext().getAttribute("service");
if(service==null){
service=new UserService();
getServletContext().setAttribute("service", service);
}
}
//得到path
String path=null;
path=request.getServletPath();
path=path.substring(0, path.length()-3);
if(path.equals("/login")){
//得到参数用户名密码
String userName=request.getParameter("user");
String pwd=request.getParameter("pwd");
//调用m层的一个方法检查用户输入的用户名和密码是不是正确
try{
User user=service.login(userName,pwd);
if(user!=null){
//将用户名和密码保存到session中
HttpSession session=request.getSession(true);
session.setAttribute("user", user);
//转发给路径为/find.do的servlet
forward("/find.do",request,response);
//登录成功,进行用户信息显示
}else{
// 如果输入的不对,那么进入login.html页面
forward("/login.do",request,response);
}
}catch(Exception e){
e.printStackTrace();
forward("/error.html", request, response);
}
}else if(path.equals("/find")){
//访问m层,查询用户信息
Collection users=service.findAll();
request.setAttribute("users", users);
forward("/user/list",request,response);
}else if(path.equals("/add")){
String name=request.getParameter("name");
User user=new User();
int id=service.nextId();
user.setName(name);
user.setId(id);
service.add(user);
forward("/find.do",request,response);
}else if(path.equals("/tomodify")){
//得到id
int id=Integer.parseInt(request.getParameter("id"));
User user=service.findById(id);
request.setAttribute("user", user);
forward("/user/modify",request,response);
}else if(path.equals("/modify")){
int id=Integer.parseInt(request.getParameter("id"));
String name=request.getParameter("name");
User user=new User();
user.setId(id);
user.setName(name);
service.update(user);
forward("/find.do",request,response);
}else if(path.equals("/delete")){
int id=Integer.parseInt(request.getParameter("id"));
service.delete(id);
forward("/find.do",request,response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}
private void forward(String path,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
RequestDispatcher rd=getServletContext().getRequestDispatcher(path);
rd.forward(request, response);
}
}
/*
* 程序目标:
* 动态显示添加页面
*/
package userapp.ums.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import userapp.ums.entity.User;
public class UserAddServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session=request.getSession(false);
User admin=(User) session.getAttribute("user");
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>user add</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3 align=/"center/">User Add</h3>");
out.println("<hr>");
out.println("Welcome, " + admin.getName());
out.println("<center>");
out.println("<form action=/"" + request.getContextPath() + "/add.do/" method=/"post/">");
out.println("name:<input type=/"text/" name=/"name/" size=/"15/">");
out.println("<input type=/"submit/" value=/"add/">");
out.println("<input type=/"button/" value=/"back/" οnclick=/"history.back()/">");
out.println("</form>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(request, response);
}
}
/*
* 程序目标:
* 将结果通过html等技术显示在浏览器上
* 知识点:
* 1.window.location='url路径' 点add按钮后,请求的url
* 这里是:http://127.0.0.1:8090/userapp/user/add.do
* 2.getContextPath():得到web应用的根路径
* 3.动态创建链接路径
*/
package userapp.ums.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import userapp.ums.entity.User;
public class UserListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//v层动态输出用户列表,会话可以结束了
HttpSession session=request.getSession(false);
User admin=(User) session.getAttribute("user");
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>user list</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3 align=/"center/">User List</h3>");
out.println("<hr>");
out.println("welcome,"+admin.getName());
out.println("<table align=/"center/" border=/"1/" width=/"500/">");
out.println("<tr>");
out.println("<th width=/"30/">no</th>");
out.println("<th>name</th>");
out.println("<th width=/"5%/" >operation</th>");
out.println("</tr>");
Collection users=(Collection) request.getAttribute("users");
Iterator it=users.iterator();
int no = 1;
while(it.hasNext()){
User user=(User) it.next();
out.println("<tr>");
out.println("<td align=/"center/">" + (no++) + "</td>");
out.println("<td>" + user.getName() + "</td>");
out.println("<td nowrap>");
out.println("<a href=/"" + request.getContextPath() + "/tomodify.do?id=" + user.getId() + "/">modify</a>");
out.println("|<a href=/"" + request.getContextPath() + "/delete.do?id=" + user.getId() + "/" οnclick=/"return confirm('are you sure to delete it?')/">delete</a></td>");
out.println("</tr>");
}
out.println("</table>");
out.println("<br>");
//创建添加按钮,window.location='url路径'
out.println("<center><input type=/"button/" value=/"add/" οnclick=/"window.location='" + request.getContextPath() + "/user/add'/"></center>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
doGet(request, response);
}
}
package userapp.ums.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import userapp.ums.entity.User;
public class UserModifyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session=request.getSession(false);
User admin=(User) session.getAttribute("user");
User user=(User) request.getAttribute("user");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>user modify</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3 align=/"center/">User Modify</h3>");
out.println("<hr>");
out.println("Welcome, " + admin.getName());
out.println("<center>");
out.println("<form action=/"" + request.getContextPath() + "/modify.do/" method=/"post/">");
out.println("<input type=/"hidden/" name=/"id/" value=/"" + user.getId() + "/">");
out.println("name:<input type=/"text/" name=/"name/" size=/"15/" value=/"" + user.getName() + "/">");
out.println("<input type=/"submit/" value=/"save/">");
out.println("<input type=/"button/" value=/"cancel/" οnclick=/"history.back()/">");
out.println("</form>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}