Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
- 下载安装与卸载
官网下载:http://tomcat.apache.org/
安装:解压压缩包即可- 注意:安装目录建议不要有中文和空格
卸载:删除目录就行了
- 注意:安装目录建议不要有中文和空格
Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet 理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用 来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
创建项目
创建首页
端口冲突问题
这个错误说明端口被占用了,8080 / 8005
如果是tomcat启动了多次,导致端口被占用,需要把原来的tomcat关闭,再重新启动即可
注册和映射
<!-- servlet注册 说明有这么一个类, 这个类在哪里 , 叫什么等等 -->
<servlet>
<!-- servlet的名字 比如HelloServlet_01就可以这样写 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 类全名(带包名) 推荐复制粘贴, 这样不会出错 -->
<servlet-class>com.helloServlet_01</servlet-class>
</servlet>
<!-- servlet和url的映射 -->
<servlet-mapping>
<!-- 名字, 需要和注册时的名称一致 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 当有下面的请求的时候, 会执行HelloServlet 注意: /是必须加的 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- 上面的注册和映射与 @WebServlet("/hello") 注解是一致的 只需要在括号里写上自己的请求就可以 -->
<!-- 在类的上面写上@WebServlet("/hello") 这样的注解, 就需要再在web.xml中写注册和映射了 -->
servlet接口
public class helloServlet_01 implements Servlet {
/*
*
* 当我们开始请求的时候, 会先执行web.xml, 匹配路由(就是xml文件配置的那些映射), 匹配如果不成功会报404 匹配成功的时候,
* 会先执行init, 并且只执行一次, 让后会执行servlet方法, 每次请求都会执行 在关闭Tomcat服务的时候, destory才会执行,
* 并且与init一样, 只执行一次
*
* @see javax.servlet.Servlet#service(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse)
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("逻辑操作");
// 设置相应类型的编码
arg1.setContentType("text/html;charset=utf-8");
arg1.getWriter().write(
"<a href='https://www.baidu.com/' target='_blank'>百度</a>");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
}
}
HttpServlet类
public class hTTPServlet_02 extends HttpServlet {
// 1 把request和response对象进行了类型转换
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)resp;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
}
requestAPI
public class requestAPI_04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/**
* 1. 获取请求行数据
* 方法:
* 1. 获取请求方式 :GET String getMethod()
* 2. (*)获取虚拟目录:/day14 String getContextPath()
* 3. 获取Servlet路径: /demo1 String getServletPath()
* 4. 获取get方式请求参数:name=zhangsan String getQueryString()
* 5. (*)获取请求URI:/day14/demo1 String getRequestURI() StringBuffer getRequestURL()
* 6. 获取协议及版本:HTTP/1.1 String getProtocol()
* 7. 获取客户机的IP地址: String getRemoteAddr()
*/
// GET
// /Servlet_01
// /requestAPI_01
// null
// /Servlet_01/requestAPI_01
// http://localhost:8080/Servlet_01/requestAPI_01
// HTTP/1.1
// 0:0:0:0:0:0:0:1
// 60843
// 1 获取请求方式 GET
String method = request.getMethod();
System.out.println(method);
// 2 获取虚拟目录 (根目录,项目名) /Servlet_01
System.out.println(request.getContextPath());
// 3 获取请求路径 /requestAPI_01
System.out.println(request.getServletPath());
// 4 获取get方式请求参数 name=123&pwd=root
System.out.println(request.getQueryString());
// 5 获取URI (基于服务器的相对路径) /Servlet_01/requestAPI_01
System.out.println(request.getRequestURI());
// 6 获取URL 基于服务器的绝对路径 http://localhost:8080/Servlet_01/requestAPI_01
System.out.println(request.getRequestURL());
// 7 版本 HTTP/1.1
System.out.println(request.getProtocol());
// 8 IP 0:0:0:0:0:0:0:1(客户端地址,本地显示0.0.0.....:1)
System.out.println(request.getRemoteHost());
// 9 端口 客户端端口63194
System.out.println(request.getRemotePort());
}
}
getHead
@WebServlet("/getHead")
public class getHead_05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取所有的请求头的名称
Enumeration<String> head = req.getHeaderNames();
while (head.hasMoreElements()) {
String name = head.nextElement();
// 根据name获取请求头的值
String value = req.getHeader(name);
System.out.println(name + " : " + value);
}
// 判断浏览器
String agent = req.getHeader("user-agent");
if (agent.contains("Chrome")) {
System.out.println("谷歌");
} else if (agent.contains("Firefox")) {
System.out.println("火狐");
}
}
}
referer
/*
* 就是只能跳转才能相应请求, 不跳转直接在浏览器上写不会相应请求的
* 直接在浏览器上头写/referer会显示下面这个
* null
* 请在爱奇艺播放
*
* 从aaa标签跳转的就会显示正在播放
* http://localhost:8080/Servlet_01/index.html
* 正在播放
*/
@WebServlet("/referer")
public class referer_06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 防盗链
String referer = req.getHeader("referer");
System.out.println(referer);
if (referer == null) {
System.out.println("请在爱奇艺播放");
} else {
System.out.println("正在播放");
}
}
}
doGet和doPost
public class getParameter_07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("正在使用doGet请求");
// 设置字符编码
req.setCharacterEncoding("UTF-8");
// 获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + " : " + password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("正在使用doPost请求");
// 设置字符编码
req.setCharacterEncoding("UTF-8");
// 获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + " : " + password);
}
}