Servlet快速入门
Posted yzx-sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet快速入门相关的知识,希望对你有一定的参考价值。
1.创建web项目,导入servlet依赖坐标
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>povided</scope> </dependency>
2.创建:定义一个类,实现servlet接口,并重写接口中的所有方法,并在service方法中输入一句话
3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
4.访问:启动Tomcat。浏览器输入URL访问Servlet
tomcat和servlet快速入门教程!!!
Tomact和servlet快速入门教程
tomcat的入门必备知识
1.下载:
2.安装: 解压压缩包即可
注意:安装目录建议不要有中文和空格
3.卸载: 删除目录即可
4.启动:
4.1 bin/startup.bat ,双击运行该文件即可
4.2 访问:浏览器输入: http://localhost:8080 回车访问自己
或者 http://别人的ip:8080 访问别人
可以通过ipconfig:查看本机ip地址
4.3 启动可能出现的问题:
4.3.1 黑窗口一闪而过:
原因: 没有正确配置JAVA_HOME环境变量
4.3.2 启动报错:
原因: 端口号被占用
推荐的解决方法1: 找到占用的端口号,并且找到对应的进行,杀死该进程
在cmd窗口输入netstat -ano
打开任务管理器,找到刚才的进程ID,然后结束该进程
解决方法2: 修改自身端口号
conf/server.xml用记事本打开,将其默认端口号修改即可,可能还需要连带着修改其他的相关默认端口号才行
一般会把tomcat的默认端口号修改为80.
80端口号是http协议的默认端口号
好处:在访问时,就不需要输入端口号了
5.关闭:
强制关闭: 点击窗口的x
正常关闭: bin/shutdown.bat
或者ctrl+c
6.部署:
部署方式:
1.直接将项目放到webapps目录下即可
/hello: 项目的访问路径---->虚拟目录
简化部署:将项目打包成一个war包,再将war包部署到webapps目录下面
war包会自动解压缩.
2.配置conf/server.xml文件
在< Host >标签体中配置
<Context docBase="D:\\hello" path="/hehe" />
docBase: 项目存放的路径
path: 虚拟目录
3.在conf\\Catalina\\localhost创建了一个任意名称的xml文件。
在文件中编写:
<Context docBase="D:\\hello"/>
虚拟目录就是xml文件的名称
静态项目和动态项目
目录结构:
java动态项目的目录结构:
-项目根目录
–WEB-INF目录:
— web.xml: web项目的核心配置文件
—classes: 放置字节码文件的目录
—lib目录: 放置依赖的jar包
将tomcat集成到IDEA中,并且创建JavaEE项目,部署项目
Servlet
概念:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到的(tomcat)规则
将来我们自定义一个类,实现Servlet接口,复写方法
web动态工程目录介绍
热部署
Tomcat上的部署问题,有时候也是个麻烦的问题,要是不采用热部署,我们就只能每次对原来的文件做一次改动的时候就要重新部署,而每次重新部署都要关闭tomcat,部署完重启tomcat,可见这是一个多么烦人的事情。现在,我们可以采用热部署了,以后,就不用做烦人的关闭重起工作。
热部署的设置:
快速入门
- 创建JavaEE项目
- 定义一个类,实现Servlet的接口
- 实现接口中的抽象方法
- 配置servler
在wed.xml的< web-app >标签里面进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Servlet-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>demo1</servlet-name>
<!--servlet-class是servlet的全类名-->
<servlet-class>web.servlet.servletDemo</servlet-class>
</servlet>
<!--给servlet程序配置访问地址-->
<servlet-mapping>
<!--告诉服务器,我当前配置的地址给哪个servlet程序使用-->
<servlet-name>demo1</servlet-name>
<!--配置访问地址
/ 斜杠在服务器解析的时候表示地址为: http://ip:port/工程路径
/demo1 表示地址为: http://ip:port/工程路径/demo1
-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
常见错误:
url-pattern配置的路径中没有以斜杠打头
servlet-name配置的值不存在
servlet-class标签全类名配置错误
工程路径名修改:
URL地址定位实现原理
执行原理:
1.当服务器接收到客户端的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2.查找web.xml文件,看是否有对应的< url-pattern >标签内容体
3.如果有,则在找到对应的< servlet-class >全类名
4.tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
生命周期方法
servlet中的生命周期:
- 被创建: 执行Init方法,只执行一次
- 提供服务: 执行service方法,执行多次
- 被销毁: 执行destory方法,只执行一次
Servlet的创建时机:
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Sevlet的创建时机,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Servlet-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>demo1</servlet-name>
<!--servlet-class是servlet的全类名-->
<servlet-class>web.servlet.servletDemo</servlet-class>
<!-- 指定Servlet的创建时机
1.第一次被访问时,创建
<load-on-startup>的值为负数
2.在服务器启动时,创建
<load-on-startup>的值为0或者正整数
-->
<load-on-startup>5</load-on-startup>
</servlet>
<!--给servlet程序配置访问地址-->
<servlet-mapping>
<!--告诉服务器,我当前配置的地址给哪个servlet程序使用-->
<servlet-name>demo1</servlet-name>
<!--配置访问地址
/ 斜杠在服务器解析的时候表示地址为: http://ip:port/工程路径
/demo1 表示地址为: http://ip:port/工程路径/hello
-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
Servlet的init方法只执行一次,说明Servlet在内存中只存在一个对象,说明Servlet是单例的
- 多个对象同时访问时,可能存在线程安全问题
- 解决: 净量不要再Servlet中定义成员变量.即使定义了成员变量也不要修改其值
每次访问Servlet时,service方法都会被调用一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
只有服务器正常关闭时,才会执行destory
销毁方法在对象被销毁前执行
注解配置
Servlet 3.0以上才支持注解配置,支持注解配置后,就不需要web.xml了。
对于web.xml来说,对应的每一个servlet工程都需要重新配置一个web.xml太过繁琐
步骤:
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类来实现Servlet的接口
- 复写方法
- 在类上使用@WebServlet注解,进行配置
注解就是加在类上面的,因此不需要关心全类名了,也就不需要再通过name属性做对应关系了
@WebServlet(urlPatterns="资源路径");
简化写法---->注解中最重要的属性value,其实就是urlPatterns属性,因此可以省略value
@WebServlet("资源路径");
IDEA与tomcat的相关配置
Servlet的体系结构
Servlet的urlpattern配置
1. urlpattern:servlet的访问路径
2.一个servlet可以定义多个访问路径: @WebServlet({"/Demo2","/dhy","/ly"})
3.路径定义规则:
1. /xxx
2. /xxx/xxx :多层路径,目录结构
- *.xxx
Servlet的url详解
Http
Http请求数据格式
Request对象
Request对象的继承体系结构
Request的功能
获取请求行数据
代码演示:
package request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/RequestServlet")
public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求方式: GET
String method=request.getMethod();
System.out.println(method);
//2.获取虚拟目录: /demo2
String contextPath=request.getContextPath();
System.out.println(contextPath);
//3.获取servlet路径:/RequestServlet
String servletPath=request.getServletPath();
System.out.println(servletPath);
//4.获取get方式请求参数: name=dhy
String queryString=request.getQueryString();
System.out.println(queryString);
//5.获取请求URI: /demo2/RequestServlet
String requestURI=request.getRequestURI();
StringBuffer requestURL=request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6.获取协议及版本: HTTP/1.1
String protocol=request.getProtocol();
System.out.println(protocol);
//7.获取客户机的IP地址
String remoteAddr=request.getRemoteAddr();
System.out.println(remoteAddr);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
获取请求头数据
获取所有头名称代码演示:
package request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求头数据
//1.获取所有请求头名称
Enumeration<String> headerNames=request.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements())
{
String name=headerNames.nextElement();
//更据名称获取请求头的值
String header=request.getHeader(name);
System.out.println(name+"------"+header);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
获取浏览器版本相关信息代码演示:
package request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据: user-agent
String agent=request.getHeader("user-agent");//不区分大小写
//判断agent的浏览器版本:
if(agent.contains("Chrome"))
{
System.out.println("当前正在使用的是谷歌浏览器");
}
else if(agent.contains("Firefox"))
{
System.out.println("当前正在使用火狐浏览器");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
告诉服务器请求从哪里来—referer:
package request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据: user-agent
//告诉服务器请求当前servlet实例的请求从哪里来的,是否来自指定网址
String referer=request.getHeader("referer");//不区分大小写
System.out.println(referer); // http://localhost:8080/demo2/login.html
//防止盗链
if(referer!=null)
{
if(referer.contains("/demo2"))
{
System.out.println("下面播放极限挑战");
}
else//盗链
System.out.println("请付费支持正版");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
获取请求体数据
代码演示:
package request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/demo")
public class reqServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpSe以上是关于Servlet快速入门的主要内容,如果未能解决你的问题,请参考以下文章