IDEA中创建Maven Web项目
web项目结构:
Maven Web项目结构:
开发中的项目
部署的Java项目结构:
开发完成可以部署的项目
注意:
编译后的Java字节码文件和resources的资源文件,放到WEB-INF下的classes目录下
pom.xml中依赖坐标对应的jar包,放入WEB-INF下的lib目录下
方式一:使用骨架
骨架:项目模板
1.选择web项目骨架,创建项目
2.删除pom.xml中多余的坐标
3.补齐缺失的目录结构
方式二:不使用骨架
1.选择web项目骨架,创建项目
2.pom.xml中添加打包方式为war
3.补齐缺失的目录:webapp
IDEA中使用Tomcat
1.集成本地Tomcat
将本地Tomcat集成到idea中,然后进行项目部署即可
2.使用Tomcat Maven插件
1.pom.xml添加Tomcat插件
2.使用Maven Helper插件快速启动项目,选中项目,右键Run Maven-->tomcat7:run
Servlet
Servlet是Java提供的一门动态web资源开发技术
Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
Servlet快速入门
1.创建web项目,导入Servlet依赖坐标
java
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
java
package com.itheima.web;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
java
@WebServlet("/demo")
4.访问:启动Tomcat,浏览器输入URL访问该Servlet
html
http://localhost:8080/web-demo/demo1
Servlet执行流程&生命周期
Servlet执行流程
1.Servlet由谁创建?Servlet方法由谁调用
Servlet由服务器创建,Servlet方法由web服务器调用
2.服务器怎么知道Servlet中一定有service方法?
因为我们自定义的Servlet,必须实现Servlet'接口并复写其方法,而Servlet接口中有service方法
Servlet执行周期
对象的生命周期指一个对象从被创建到被销毁的整个过程
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为四个阶段:
1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
2.初始化:在Servlet实例化后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放Servlet实例,该实例随后会被Java的垃圾收集器所回收
Servlet方法介绍
初始化方法,在Servlet被创建时执行,只执行一次
java
void init(Servlet config)
提供服务方法,每次Servlet被访问,都会调用该方法
java
void service(ServletRequest req,ServletResponse res)
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
java
void destory()
获取ServletConfig对象
java
ServletConfig getServletConfig()
获取Servlet信息
java
String getServletInfo()
Servlet体系结构
Servlet体系根接口
Servlet抽象实现类
对HTTP协议封装的Servlet实现类
我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet
Servlet urlPattern配置
Servlet要想被访问,必须配置其访问路径(urlPattern)
1.一个Servlet,可以配置多个urlPattern
java
@WebSrvlet(urlPatterns = {"/demo1","/demo2"})
2.urlPattern配置规则
1.精确匹配
配置路径:
java
@WebServlet("/user/select")
访问路径:
localhost:8080/web-demo/user/select
2.目录匹配
配置路径:
java
@WebServlet("/user/*")
访问路径:
localhost:8080/web-demo/user/aaa
localhost:8080/web-demo/user/bbb
3.扩展名匹配
配置路径:
java
@WebServlet("*.do")
访问路径:
localhost:8080/web-demo/aaa.do
localhost:8080/web-demo/bbb.do
4.任意匹配
配置路径:
java
@WebServlet("/")
java
@WebServlet("/*")
访问路径:
localhost:8080/web-demo/hehe
localhost:8080/web-demo/haha
Request获取请求数据
请求数据分为3部分:
1.请求行:
Stinrg getMethod():获取请求方式:GET
String getContexPath():获取虚拟目录(项目访问路径)
StringBuffer getRequestURL():获取URL(统一资源定位符)
String getRequestURI():获取URL(统一资源标识符)
String getQueryString():获取请求参数(GET方式)
2.请求头:
String getHeader(String name):根据请求头名称,获取值
3.请求体:
ServletputStream getInputStream():获取字节输入流
BufferReader getReader():获取字符输入流
Request通用方式获取请求参数
请求参数获取方式:
GET方式:
java
String getQueryString()
POST方式:
java
BufferdReader getReader()
Map<String,String[]> getParameterMap():获取所有参数Map集合
String[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(单个值)
请求转发
请求转发(forward):一种在服务器内部的资源跳转方式
实现方式:
java
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
void setAttribute(String name,Object o):存储数据到request域中
Object getAttribute(String name):根据key,获取值
void removeAttribute(String name):根据key,删除该键值对
请求转发特点:
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
Response设置响应数据功能
响应数据分为3部分:
1.响应行:
void setStatus(int sc):设置响应状态码
2.响应头:
void setHeader(String name,String value):设置响应头键值对
3.响应体:
PrintWriter getWriter():获取字符输出流
ServletOutPutStream getOutputStream():获取字节输出流
Respon完成重定向
重定向(Redirect):
一种资源跳转方式
实现方式:
java
resp.setStatus(302);
resp.setHeader("location","资源B的路径");
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)
两次请求,不能在多个资源使用request共享数据
资源路径问题
明确路径对谁使用
浏览器使用:
需要加虚拟目录(项目访问路径)
服务器使用:
不需要加虚拟目录
Response响应字符数据
使用:
1.通过Response对象获取字符输出流
java
PrintWriter writer = resp.getWriter();
2.写数据
java
writer.writer("aaa");
注意:
该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
java
resp.setContentType("text/html;charset=utf-8");
Response响应字节数据
使用:
1.通过Response对象获取字符输出流
java
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
java
outputStream.write(字节数据);
Response响应字节数据
java
FileInputStream fis = new FileInputStream("d://a.jpg");
ServletOutputStream os = resp.getOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1){
os.write(buff,0,len);
}
fis.close();