tomcat&Servlet

JavaWeb技术

JavaWeb技术栈
  • web:全球广域网,也称万维网,能够通过浏览器访问的网站
  • B/S架构:browser/server,浏览器服务器架构,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可
  • 好处:易于维护升级,服务器端升级后,客户端无需任何部署就可以使用到新的版本
  • 静态资源:HTML、CSS、JS、图片等。负责页面展现
  • 动态资源:Servlet、JSP等。负责逻辑处理
  • 数据库:负责存储数据
  • HTTP协议:定义通信的规则
  • Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据
HTTP
  • HyperText Transfer Protocol,超文本传输协议,规定浏览器与服务器之间数据传输的规则

  • http协议特点

    • 基于TCP协议:面向连接,安全
    • 基于请求-响应模型的:一次请求对应一次响应
    • HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
      • 缺点:多次请求之间不能共享数据
      • 优点:速度快
HTTP请求数据格式

1.请求行:请求数据的第一行。其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本

2.请求头:第二行开始,格式为key:value形式

3.请求体:POST请求的最后一部分,存放请求参数

常见的HTTP请求头

Host:请求的主机名
User-Agent:浏览器版本,如谷歌浏览器的标识类似Mozilla/5.0...
Accept:表示浏览器能接收的资源类型
Accept-Language:表示浏览器偏好的语言
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等
  • GET与POST请求区别
  • GET请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
  • GET请求参数大小有限制,POST没有
响应数据格式

1.响应行:响应数据的第一行。由协议版本,响应状态码,状态码描述组成

2.响应头:第二行开始,格式为key:value形式

3.响应体:最后一部分。存放响应数据

常见响应头

Content-Type:表示该响应内容的类型
Content-Length:表示响应内容的长度
Content-Encoding:表示该响应压缩算法
Cache-Control:指示客户端应如何缓存

响应状态码中:200代表客户端请求成功,404代表资源找不到,一般是URL输入有误,500服务器发生不可预期的错误,服务器异常

Web服务器

Web服务器是一个应用程序软件,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷

Tomcat
  • 它是一个开源且免费的轻量级Web服务器,支持Servlet/JSP,少量JavaEE规范
  • JavaEE:Java企业版。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、JavaIDL、JTS、JTA、JavaMail、JAF
  • Tomcat也被称为Web容器,Servlet容器。Servlet需要依赖于Tomcat才能运行
IDEA中创建Maven Web项目
  • 创建项目两种方式:使用骨架,不使用骨架

  • Web项目结构:

    
    Maven Web项目结构:开发中的项目
    项目名称
    	src							主目录
    		main		
    			java				java代码
    			resources			资源文件,配置文件
    			webapp				Web项目特有目录
    				html			HTML文件目录
    				WEB-INF			Web项目核心目录
    					web.xml		Web项目配置文件
    		test					测试目录
    			java
    			resources
    	pom.xml
    
    部署的JavaWeb项目结构:开发完成,可以部署的项目
    	项目名称			项目访问路径
    		html		   HTML文件目录
    		WEB-INF		   Web项目核心目录
    			web.xml	   Web项目配置文件
    		classes	   Java字节码文件
    		lib		   项目所需jar包
    			
    			
    编译后的Java字节码文件和resources的资源文件,放到WEB-INF下的classes目录下
    pom.xml中依赖坐标对应的jar包,放入WEB-INF下的lib目录下
    

Servlet

  • 是JavaEE的一个规范,体现出来就是一个接口

  • Servlet是Java提供的一门动态web资源开发技术

Servlet快速入门
1.创建web项目,导入Servlet依赖坐标
<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!--
              此处为什么需要添加该标签?
              provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
               因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
            -->
            <scope>provided</scope>
</dependency>
2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法
3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
4.访问:启动Tomcat,浏览器输入URL访问该Servlet
		例:localhost/虚拟目录/资源路径
Servlet执行流程

tomcat接收请求,解析请求路径,找到具体访问项目,再找到要访问的资源,tomcat就会创建对应的servlet实现类对象,并且调用service方法

servlet生命周期
init():tomcat创建Servlet实现类对象的时候会自动调用该方法

	1.默认是第一次访问该动态资源时,可以通过loadOnStartup属性进行修改,如果值是正整数就是在服务器启动的时候创建Servlet实现类对象

 	2.@WebServlet(value="动态资源路径",loadOnStartup=1)

service():每一次请求该资源都会执行

destory():销毁servlet时。
Servlet方法介绍
初始化方法,在Servlet被创建时执行,只执行一次
public void init(ServletConfig servletConfig)
获取ServletConfig对象
public ServletConfig getServletConfig()
提供服务的方法,每次Servlet别访问,都会调用该方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse) 
获取Servlet信息
public String getServletInfo() 
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
public void destroy()
Servlet体系结构
Interface Servlet			Servlet体系的根接口
	Class GenericServlet	抽象实现类
		Class HttpServlet	对Http协议封装的Servlet实现类
		
HttpServlet使用步骤
	1.继承HttpServlet
	2.重写doGet和doPost方法
原理:获取请求方式,并根据不同的请求方式调用不同的doXxx方法
Servlet urlPattern配置

1.一个Servlet,可以配置多个urlPattern

@WebServlet(urlPatterns={"/demo1","/demo2"})

2.urlPattern配置规则

​ 1.精确匹配 精确的路径,/ 开头

​ 2.目录匹配 / 开头 *结尾

​ 3.扩展名匹配 * 开头,后面跟上 .后缀名,如 *.do

​ 4.任意匹配 @WebServlet("/") @WebServlet("/*")

XML配置方式编写Servlet
  • Servlet从3.0版本开始支持使用注解配置,3.0版本之前只支持XML配置文件的配置方式
  • 步骤
    • 1.编写Servlet类
    • 2.在web.xml中配置该Servlet
<servlet>
    <servlet-name>demo1</servlet-name>
    <servlet-class>com.itheima.web.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>demo1</servlet-name>
	<url-pattern>/demo1</url-pattern>
</servlet-mapping>

Request&Response

Request(获取请求数据)

继承体系
ServletRequest				Java提供的请求对象根接口
HttpServletRequest			Java提供的对Http协议封装的请求对象接口
RequestFacade				Tomcat定义的实现类
获取请求数据
请求行
String getMethod():获取请求方式
String getContextPath():获取虚拟目录
StringBuffer getRequestURL():获取URL(统一资源定位符)
String getRequestUPI():获取URI(统一资源标识符)
String getQueryString():获取请求参数(GET方式)
请求头
String getHeader(String name):根据请求头名称,获取值(如:User-Agent)
请求体
ServletInputStream getInputStream():获取字节流
BufferedReader getReader():获取字符输入流
通用的方式获取请求参数
Map<String,String[]> getParameterMap():获取所有参数Map集合
String[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(单个值)
请求参数中文乱码处理

1.POST请求的解决方式

request.setCharacterEncoding("UTF-8")		设置字符输入流的编码

2.GET请求的解决方式

乱码原因:
	浏览器使用设置的UTF-8对数据进行URL编码,发送到Tomcat,默认ISO-8859-1进行URL解码,所以出现乱码
	//URL编码
	String encode=URLEncoder.encode("哈哈","UTF-8");
	//URL解码
	String decode=URLDecode.decode(encode,"UTF-8");
	//解决方案1
	username=new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8)
	//解决方案2,在pom.xml文件tomcat中配置uriEncoding
			<plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--端口控制-->
                    <port>80</port>
                    <!--虚拟目录-->
                    <path>/web-demo</path>
                    <!--编码(get请求方式)-->
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
请求转发
  • 请求转发(forward):一种在服务器内部的资源跳转方式

实现:

request.getRequestDispatcher("/资源路径").forward(request,response);

request用于共享数据的方法:

setAttribute(String name,Object value)
Object getAttribute(String name)
removeAttribute(String name)

请求转发的特点

​ 1.浏览器地址栏不发生变化‘

​ 2.只能转发到当前服务器的内部资源

​ 3.一次请求,可以在转发的资源间使用request共享数据

Response(设置响应数据)

继承体系
ServletResponse			Java提供的响应对象根接口
HttpServletResponse		Java提供的HTTP协议封装的响应对象
ResponseFacade			Tomcat定义的实现类
Response设置响应数据功能介绍
响应行
void setStatus(int sc):设置响应状态码
响应头
void setHeader(String name,String value):设置响应头键值对
响应体
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
Response完成重定向
  • 重定向(Redirect):一种资源跳转方式

1.设置响应状态码302

2.响应头 location:xxx

  • 实现方式
resp.setStatus(302);
resp.setHeader("location","资源b的路径");
简化实现方式
resp.sendRedirect("资源b的路径");
重定向特点
  • 浏览器地址栏路径发生变化
  • 可以重定向到任意位置的资源(服务器内部、外部均可)
  • 两次请求,不能在多个资源使用request共享数据
路径问题

浏览器使用:需要加虚拟目录

服务端使用:不需要加虚拟目录

Response响应字符数据
response.setContenType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer=response.getWriter();
//2.设置响应头信息(内容类型)
response.setHeader("content-type","text/html");
//3.写入数据
writer.writer("hahaha");

注意:
	该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
	中文数据乱码:原因通过Response获取的字符输出流编码:ISO-8859-1
       resp.setContentType("text/html;charset=utf-8");
Response响应字节数据
1.通过Response对象获取字节输出流
ServletOutputStream outputStream=resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
IOUtils工具类的使用
1.导入坐标
<dependency>
	<groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
2.使用
IOUtils.copy(输入流,输出流);

JSP

  • 概念ÿ
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值