文章目录
Tomcat
目录介绍
Bin 存放Tomcat服务器的可执行程序
Conf 存放Tomcat服务器的配置文件
Lib 存放Tomcat服务器的jar包
Logs 存放Tomcat服务器的运行时输出的日记
Webapps 存放部署的工程
Work 是Tomcat工作时的目录,存放Tomcat运行时jsp翻译为Servlet的源码。
打开与测试
打开Startup.bat,要配置好环境变量
如何测试
浏览器输入:http://localhost:8080,有tomcat页面
停止Tomcat
1.点击Tomocat的cmd关闭按钮
2.把Tomcat服务窗口置为当前窗口,然后ctrl+c
3.找到Tomcat的bin目录下的shutdown.bat双击,即可停止
如何修改Tomcat的端口号:
找到Tomcat目录下的conf目录,找到server.xml配置文件
修改完要重启Tomcat
部署web工程到Tomcat中
1.把web工程的目录拷贝到Tomcat的webapps目录即可
http://localhost:8088/项目文件下的html
2.找到tomcat的conf\Catalina\localhost 下,创建配置文件xml
Context path="/abc"
docBase=“D:\book” />
http://localhost:8088/abc
默认打开ROOT工程,默认index.html
Tomcat部署到idea内
项目t添加jar包
在web下的web-inf下建立lib,把jar拉进去,然后add to libray
可以在Edit Configition里面修改端口号,项目,默认浏览器等数据
Servlet
servlet是javaee规范之一
Servlet是javaweb三大组件之一 listener filter
Servlet是运行在服务器的一个java小程序,接收请求,响应数据给客户端
手动实现Servlet程序
Servlet加入流程
1编写一个类去实现servlet接口,一般实现Httpservlet接口,后面学到反射,就直接继承BaseServlet即可
2实现servlet方法,处理请求,响应数据
3 到web.xml去配置servlet程序的访问地址
Servlet生命周期
1 构造器方法
2 init初始化方法
在访问的时候创建servlet会调用,之后访问不会再调用
3 servlet方法
每次访问都调用此方法
4 destory方法
在停止的时候调用
请求的分发处理
get post请求方式
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(“hello servlet 被访问了”);
//类型转换,因为它有getMethod方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod(); //获取请求协议的请求方式 get/post
System.out.println(method);
if(method.equals("GET")){
System.out.println("get请求");
}
else if(method.equals("POST")){
System.out.println("post请求");
}
}
一般在实际项目中,都是继承HttpServlet类的方式实现Servlet程序
HttpServlet实现了Servlet类内的servlet方法,就可以实现doget和dopost方法
1编写一个类去继承HttpServlet类
2重写doGet()或doPost()方法
3 到web.xml去配置servlet程序的访问地址
ServletConfig
每个servlet有不同的一个servletConfig类
三大作用:
- 1.可以获取servlet程序的别名servlet-name的值
- 2.获取初始化参数init-param
- 3.获取serveltContent对象
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 三大作用:
// 1.可以获取servlet程序的别名servlet-name的值
System.out.println(servletConfig.getServletName());
// 2.获取初始化参数init-param
System.out.println("初始化的username值:"+servletConfig.getInitParameter("username"));
// 3.获取serveltContent对象
System.out.println(servletConfig.getServletContext());
}
serveltContent
1是一个接口,表示servlet上下文对象
2一个web工程,只有一个serveltContent对象
3 serveltContent是一个域对象
四个作用
- 1获取web.ml配置的上下文参数context.param
- 2获取当前的工程路径,格式:/工程路径
- 3获取工程部署后在服务器硬盘上的绝对路径
- 4像Map一样存取数据
// 1获取web.ml配置的上下文参数context.param
ServletContext context = getServletConfig().getServletContext();
System.out.println("oookkk");
String name = context.getInitParameter("name"); /*只能获取context-param下的属性值*/
System.out.println(name);
// 2获取当前的工程路径,格式:/工程路径
System.out.println("当前的工作路径:"+context.getContextPath());
// 3获取工程部署后在服务器硬盘上的绝对路径
System.out.println("工程部署的路径是:"+context.getRealPath("/"));
// 4像Map一样存取数据
//4.存取数据
ServletContext context = getServletContext(); //获取Servletcontext对象
context.setAttribute("key1","value1");
System.out.println(context.getContext("key1"));
存好的数据,在任何一个servlet内都能通过context获取到新存数据的value值
HTTP协议
GET POST 请求方式
哪些是GET请求:
- 1.form标签 method = get
- 2.a 标签
- 3.Link标签引入css
- 4.Script标签引入js文件
- 5.Img标签引入图片
- 6.Iframe引入html页面
-7.在浏览器地址栏中输入地址后敲回车
哪些是post请求:
- 8.form标签 method = post
请求响应协议格式
响应码说明:
200 请求成功
302 请求重定向
404 请求服务器收到了,要的数据不存在(地址错了)
500 表示服务器收到请求,但是服务器内部错误(代码错误)
谷歌查看http协议:
HttpServletRequest
作用:
每次只要有请求加入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装给Request对象,然后传递到service的get,post方法。我们可以通过HttpServletRequest对象,获取请求的信息。
常用方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("123");
//1 getRequestURI() 获取请求的资源路径
System.out.println("URI-->"+req.getRequestURI());
//2.getRequestURL() 获取请求的统一资源定位符
System.out.println("URL-->"+req.getRequestURL());
//3.getRemoteHost() 获取客户端的ip地址
System.out.println("客户端的ip地址:"+req.getRemoteHost());
/*
* 在idea中,使用localhost访问时,得到地址是127.0.0.1
* 如果使用真实ip访问,得到的客户端地址就是真实ip地址
*/
//4.getHeader() 获取请求头
System.out.println("请求头-->"+req.getHeader("User-Agent"));
}
获取请求的参数值
//获取请求的数据值
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println(username+" "+password+" "+ Arrays.asList(hobby));
结果:
Request请求的转发*
服务器收到请求后,从一个资源跳转到另一个资源的操作,可以传递request请求的参数内容
Servlet程序1获取请求参数,处理业务,加盖一个章,走到servlet2程序
Servlet程序2获取请求参数,检查有没有servlet1的章,处理自己的业务
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
String username = req.getParameter("username");
System.out.println("在servlet1查看参数"+username);
//给材料盖一个章,并传递到servlet2查看
req.setAttribute("key","柜台1的章");
//问路 servlet2怎么走
//请求转发必须以/打头,斜杆表示:http://ip:port/工程名/,映射到idea代码的web目录
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//走向servlet2
requestDispatcher.forward(req,resp);
}
}
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
String username = req.getParameter("username");
System.out.println("在servlet1查看参数"+username);
//查看是否有盖章
Object key1 = req.getAttribute("key");
System.out.println("柜台1是否有章"+key1);
//处理自己的业务
System.out.println("servlet2 处理自己的业务");
}
}
请求转发的特点:
- 1.浏览器地址栏没有变化
- 2.他们是一次请求
- 3.他们共享request域内的数据
- 4.可以转发到web-inf目录下
1.<url-pattern>/servlet1</url-pattern>
System.out.println("工程部署的路径是:"+context.getRealPath("/")); //web文件夹映射后的
req.getRequestDispatcher("/");
特殊情况:
Response.sendRedirect(“/”); 把斜杆发送给客户端解析
HttpServletRsponse
作用
每次请求进来,都会创建一个Response对象给servlet程序使用,表示响应信息
如果需要设置返回给客户的信息,都可以通过response对象来设置
输出流
字节流或者字符流,不能同时使用,会报错500
resp.getWriter();
resp.getOutputStream();
如何回传数据
writer.write(“response’s content!!!”);
解决数据乱码问题
resp.setContentType(“text/html; charset=UTF-8”);
Response请求重定向*
指客户端给服务器发送请求,服务器告诉客户端说我给你一些地址,你去新地址访问,叫请求重定向(因为之前的地址可能已经被废弃)
客户端访问第一个response程序,因为这个程序已经被废弃了,不过有义务告诉客户端:响应码: 302, 响应头:Location 新的response的地址
客户端接收到新地址,就去新地址访问
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此一流 Response1 ");
// //设置响应状态码,表示重定向
// resp.setStatus(302);
// //设置响应头,说明新的地址在哪
// resp.setHeader("Location","http://localhost:8088/_07servlet/response2");
//302是固定的,所以直接设置新地址即可
resp.sendRedirect("http://localhost:8088/_07servlet/response2");
}
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("到此 response2");
resp.setContentType("text/html;charset:UTF-8");
resp.getWriter().write("response2's result!");
}
}
这样访问response1的时候就会跳转到response2
特点:
- 1浏览器地址栏会变化
- 2两次请求
- 3请求重定向不共享request中的数据,跟请求的转发中request共享是不同的
- 4无法直接访问WEB-INF下的文件
- 5可以访问外部的URL地址(百度)
Base标签
可以设置一个当前页面中所有相对页面工作时,参照这个路径来跳转
<base href="http://localhost:8088/_07servlet/a/b/">
Web中斜杠的不同意义
在web中,/是一种绝对路径
如果被浏览器解析,得到的地址是 http://ip:port
如果被服务器解析,得到的地址是 http://ip:port/工程路径
以后的请求一般都是重定向,除非要回传数据,出现页面跳转的话,就用重定向,这样就不会有按F5出现多次发送请求的BUG