转:(eclipse 引入tomcat)http://www.cnblogs.com/yean/archive/2009/07/27/1532338.html
转:(新建web项目及存放位置)https://jingyan.baidu.com/article/ce436649f3334e3773afd3e0.html
转:(servlet详解) http://www.cnblogs.com/whgk/p/6399262.html
转:(8080端口占用)https://jingyan.baidu.com/article/215817f784c2d61eda1423c4.html?qq-pf-to=pcqq.discussion
8080端口占用还有一种简单方法:启动任务管理器--->进程 (找到eclipse里的.exe 在进程里找到 关闭即可)
servlet程序运行过程:
1.客户端请求 http://localhost:8080/test/pp
2.请求到服务器端找的是servlet容器(tomcat)
3.在tomcat目录下的webapps文件夹下面找到符合javaee规定的目录(项目)。-test
4.在web项目当中优先找到配置文件,通过url-pattern 属性的地址,匹配servlet-name与该映射名称相同的<servlet>标签
5.<servlet>标签配置的是servlet程序的class文件
6.使用servlet中的doGet()或doPost(service方法分配)方法执行请求的处理
1.servlet 允许将action属性设置为 映射 ,通过映射找到相关的servlet class进行数据的处理
2.服务器容器,服务器中间件 apache-> tomcat 7, weblogic
3.搭建servlet开发环境
startup.bat:启动tomcat服务
shutdown.bat:终止tomcat服务
配置tomcat环境变量 让cmd命令行可以直接运行这些批处理文件。
CATALINA_HOME:tomcat根目录
path:%CATALINA_HOME%in;%CATALINA_HOME%lib;
*先打开服务
然后通过 http://localhost:8080/
是否可以打开网页 判断 是否配置成功*
4.javaee 的项目要符合javaee的标准。
1.javaee app 要放在tomcat下的webapps这个目录下面
2.编译后的.class文件,html文档,图片,视频.....
3.在webapps下面部署的项目必须要有 WEB-INF 这样一个目录
4.javaee app 需要一个独有的 web.xml 对其进行设置
5.使用tomcat容器部署一个html文档的步骤:
- 在 webapps 目录下新建文件夹test
- 在test目录下 要新建 WEB-INF文件夹
- 在WEB-INF下面新建 web.xml配置文件
- 将web.xml配制成webapps的配置文件(拷贝tomcat实例程序下的文件头)
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> </web-app>
- 将html放入到webapps 文件夹test目录下(html里的内容自己随便写 在这里我是index.html)
- 解释:index 页面路径 tomcat/webapps/test/index.html
使用浏览器访问http://localhost:8080/test/index.html来访问
http://localhost:8080/这个地址就相当于 服务器端的tomcat/webapps/这个目录
6. 创建一个servlet类
1. 引入tomcat/lib/servlet-api.jar
2. 继承HttpServlet抽象类。
3. 重写HttpServlet的doGet()或者doPost() 鼠标空白处右键--》Source--》Override methods
4.随便输出一句话
5.复制servlet类的class文件到tomcat/webapps/项目名/WEB-INF/classes/ Window-->show view-->Navigator 看 自己项目的build--》classes里面有自己的类文件
<!--在web.xml里配置servlet.class--> <servlet> <servlet-name>servlet名(随便起)</servlet-name> <servlet-class>包名.类名</servlet-class> </servlet> <!-- 配置的是servlet的映射 --> <servlet-mapping> <servlet-name>要与servlet标签内的servlet名相同</servlet-name>
<!-- 服务器端代表的是tomcat/webapps/test/ 在浏览器代表的是http://localhost:8080/test/ -->
<url-pattern>从浏览器要访问这个servlet文件的url地址(随便起 但最开头必须要有/)</url-pattern> </servlet-mapping>
如下:(做到复制代码 不自己手抄代码,防止出错)
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>haha</servlet-name> <servlet-class>TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>haha</servlet-name> <url-pattern>/pp</url-pattern> </servlet-mapping> </web-app>
使用shutdown、startup重启tomcat服务器。
通过http://ip:port/program_name/url-pattern 访问servlet
如:http://localhost:8080/test/pp
---------------------------------------------------------------------------eclipse里重做第6步--------------------------------
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/TestServlet</url-pattern> </servlet-mapping> </web-app>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("xxx"); } }
运行结果:
运行 TestServlet.java
文件标准路径:(第5步 + 第6步)
lib 文件夹当前为空 classes 文件在第6步有内容
7.HttpServletRequest extends ServletRequest request : 请求
HttpServletResponse extends ServletResponse response : 响应
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 RequestResponse extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gb2312"); PrintWriter pw = response.getWriter(); String userName = request.getParameter("userName"); String pwd1 = request.getParameter("password1"); String pwd2 = request.getParameter("password2"); String dbUserName ="admin"; if(userName.equals(dbUserName)) { pw.write("用户已存在!"); }else { if(pwd1.equals(pwd2)) { pw.write("注册成功!"); }else{ pw.write("密码输入不一致"); } } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> request/response </title> </head> <body bgcolor="pink"> <form action="testRequestResponse" method="post"> <table border="1px"> <tr> <td>用户名</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password1"></td> </tr> <tr> <td>密码确认</td> <td><input type="password" name="password2"></td> </tr> <tr> <td><input type="submit" value="注册"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>haha</servlet-name> <servlet-class>Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>haha</servlet-name> <url-pattern>/pp</url-pattern> </servlet-mapping> <servlet> <servlet-name>RequestResponse</servlet-name> <servlet-class>RequestResponse</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequestResponse</servlet-name> <url-pattern>/testRequestResponse</url-pattern> </servlet-mapping> </web-app>
运行结果如下:
1.输入: http://localhost:8080/test/index.html
2.表上内容填好之后 点注册 出来结果 ,注: 此时的地址栏发生了改变 http://localhost:8080/test/testRequestResponse(这里不需要自己输入)
3.重复实验
----------------------------------------------------------------------------------------在eclipse里引入tomcat做第7步-------------------------------------------------------------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 RequestResponse extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gb2312"); PrintWriter pw = response.getWriter(); String userName = request.getParameter("userName"); String pwd1 = request.getParameter("password1"); String pwd2 = request.getParameter("password2"); String dbUserName ="admin"; if(userName.equals(dbUserName)) { pw.write("账号已存在"); }else { if(pwd1.equals(pwd2)) { pw.write("注册成功"); }else{ pw.write("密码输入不一致"); } } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> request/response </title> </head> <body bgcolor="pink"> <form action="testRequestResponse" method="post"> <table border="1px"> <tr> <td>用户名</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password1"></td> </tr> <tr> <td>密码确认</td> <td><input type="password" name="password2"></td> </tr> <tr> <td><input type="submit" value="注册"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>RequestResponse</servlet-name> <servlet-class>RequestResponse</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequestResponse</servlet-name> <url-pattern>/testRequestResponse</url-pattern> </servlet-mapping> </web-app>
项目目录:
运行index.html文件
。。。。不做截图了。。。。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8.servlet 生命周期
1.在用户请求servlet程序时,调用servlet类的 构造方法创建一个对象。
2.对象创建之后调用init()对该对象进行初始化。
3.调用service方法进行对请求的处理以及对客户端的响应
4.当web服务器关闭时,调用servlet的destory方法。销毁该对象。
注:servlet对象被创建时调用构造方法和init(),这两个方法只执行一次,servlet是单例的程序。servlet可以设计为多例,只不过不太常用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Test extends HttpServlet { public Test() { System.out.println("构造方法执行..."); } @Override public void init() throws ServletException { System.out.println("init()执行..."); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet()执行..."); } @Override public void destroy() { FileWriter fw = null; BufferedWriter bw = null; String msg = "destroy()执行..."; try { fw = new FileWriter("f:/tomcat.txt"); bw= new BufferedWriter(fw); bw.write(msg); } catch (IOException e) { e.printStackTrace(); }finally { try { bw.close(); bw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
当再刷新一次页面 只执行doGet()
当点 shutdown.bat 时 destroy()才执行,tomcat.txt由0k变为不是0k