JavaWeb(后端)

Servlet

servlet概述

Servlet是SUN公司定义的接口,是web server和java web之间的规范,是一门JAVA语言开发的动态网站技术
Servlet规范的作用是:解耦合
web server遵循servlet规范,java web遵循servlet规范,java web开发的应用软件可以在不同的web server上部署

参与的角色

一共四种角色:
浏览器软件的开发团队:谷歌,火狐,IE等等
WEB Server(网站服务器)的开发团队:Tomcat,jBOSS,Jetty等等
DB Server(数据库服务器)的开发团队:MySQL.Oracle等等
webapp的开发团队:WEB应用是我们Javaweb程序员开发

不同角色之间要遵循的协议和规范

浏览器开发团队和web server开发团队:http协议,是w3c(世界万维组织)制定的
web server开发团队和webapp开发团队:Servlet规范,是SUN公司制定的
webapp开发团队和DB server开发团队:JDBC规范,是SUN公司制定的

不使用idea开发步骤

搭建项目的骨架目录,文件
1.在webapps目录下创建目录crm,crm是项目名
2.在crm目录下创建目录WEB-INF,Servlet规范规定目录名必须是WEB-INF,全部必须大写,一模一样
3.在WEB-INF目录下创建目录classes,Servlet规范规定目录名必须是classes,全部必须小写,一模一样,存放的是编译后的class文件
4.在WEB-INF目录下创建lib目录,这个目录不是必须存在的,存放的是第三方的jar包,目录名字必须是lib全部小写
5.WEB-INF目录下创建配置文件web.xml,这个文件是必须要有的,位置必须在这里,描述了请求路径和Servlet实现类之间的映射关系,直接从webapp其他应用程序下拷贝过来,里面有内容,不要手写!
跟WEB-INF同级目录下可以创建前端语言的文件,HTML,CSS,javascript,image等等
-------------------以上基本骨架搭建完成------------------------
6.编写servlet实现类,完成业务,导入servlet的jar包和JSP的jar包
关于javaEE改版问题
JavaEE最高版本是8,之后Oracle把这个规范权限捐给了Apache了
Apache把javaEE改名为jakartaEE,9开始叫jakartaEE9
8版本Servlet包是javax.servlet.Servlet,9版本类库是jakarta.servlet.Servlet
Java项目部署到Tomcat服务器9版本及9以下的版本依旧识别的JavaEE8的javax,如果是10版本只能识别jakartaEE9的jakarta,所以注意java导入的包是否对应Tomcat版本,不然无法部署成功!
7.编译java程序,发生错误的原因是导入的包没有找到,解决办法是配置环境变量classpath,把tomcat下的Servlet.jar包作为值,.;路径,在编译即可
8.把编译好的class文件复制到webapps下WEB-INF下的classes目录
9.在web.xml文件里编写配置信息,映射请求路径和Servlet类名的关系,专业术语是注册Servlet类
任何servlet都对应一个servlet-mapping
servlet-name可以随便写,但是上下的得相同
servlet-class的路径:在classes目录下创建com目录下创建servlet目录下有TestServlet.class文件
url-pattern目前自己随便设置,以斜杠/开始不加项目名
10.在HTML文件随便写个超链接,URL路径跟xml配置文件相同,但是要加项目名,启动tomcat
11.打开浏览器地址栏输入URL
URL必须和web.xml配置文件的url-patter一致,浏览器地址栏输入的URL带有项目名,配置文件配置的URL没有带项目名!
我们可以通过前端HTML页面的超链接来访问资源,链接带项目名,这个页面的位置必须在webspps里,WEB-INF目录外面
最后:以后不再需要我们编写main方法了,Tomcat服务器启动负责调用main方法,我们javaweb开发只需要干两件事,1.编写Servlet实现类,2.注册到web.xml配置文件即可!

搭建Javaweb项目的目录结构

在这里插入图片描述
要求:web目录只要在项目下就行,可以跟src同级,也可以在Java目录下!

使用idea开发Servlet

1.创建new project空项目,进入idea创建普通java模块,之后右键模块名Add Framework Support,选择webapp框架
2.导入相关jar包到WEB-INF目录下新建的lib目录下
3.idea导入jar包的方式是打开file下project structrue找到模块,选择Dependencies点击加号导入jar包即可
4.创建实现类实现HttpServlet,编写业务
5.连接数据库需要导入mysql驱动,mysql的jar不属于java程序,导入的方式是在WEB-INF目录下创建lib目录,之后复制mysql驱动到该目录下
6.打开web.xml配置文件,配置好映射关系
7.在web目录下创建html页面,超链接方式获取数据库的数据,实现动态获取资源
8.把项目部署到tomcat服务器,打开右上角的Edit Config…,找到Tomcat Server下的Local,Server界面需要配置下启动服务器后默认打开的浏览器,jre也需要配置,服务器名字可以随便写,之后是Deployment界面,直接点击加号自动导入项目,Application context处填html页面URL的最开始的项目名,比如/projectName
9.启动tomcat服务器,输入HTML页面的URL或者输入项目名下的xx.html访问资源即可!

Servlet对象的生命周期
生命周期是一个对象从出生到死亡的整个过程

Servlet对象每个方法的作用
默认情况下服务器启动不会创建Servlet对象,当用户发送第一次请求时,对应的Servlet才会被创建,过程是先调用了Servlet的构造方法,创建好对象后马上调用了init方法,之后又调用了service方法

用户第二次发送请求时,会直接使用第一次创建好的对象,然后调用service方法,就不会再调用构造方法,init方法了

当关闭服务器的时候,servlet对象会调用destroy方法,作用是销毁内存中的对象,注意只有当方法执行结束了,才销毁对象

init方法:完成初始化,只执行一次
service方法:核心方法,用户发发送请求一次就调用一次
destroy方法:关闭服务器时调用,销毁对象,只执行一次

适配器GenericServlet抽象类

使用适配器模式原因
Servlet有五个方法,最常用的是service方法,另外的几个方法基本很少用,全部方法都实现界面会很丑陋,为了解决这个问题,所以我们有了适配器模式
SUN公司已经定义好了GenericServlet适配器抽象类,实现了Servlet接口和ServletConfig接口,解决了界面丑陋的问题,常用的方法改成抽象方法,实现类继承适配器抽象类重写常用的抽象方法就行了

ServletConfig接口

ServletConfig是Servlet对象的配置信息对象,该对象封装了web.xml配置文件的servlet标签中的配置信息,一个servlet对应一个ServletConfig对象
Servlet对象和ServletConfig对象都是由WEB容器创建和销毁,默认情况下只有当用户发送第一次请求时才会创建
tomcat服务器创建servlet对象调用init方法,参数会传入一个ServletConfig对象
ServletConfig接口的方法
getInitParameter(String name);通过name,获取value
getInitParameterNames();获取所有初始化参数的name
getServletContext();获取ServletContext对象
getServletNama();获取Servlet的name
以上方法在Servlet实现类都可通过this调用,因为实现类继承适配器抽象类,该抽象类实现了Servlet和ServletConfig

ServletContext接口(重点)

ServletContext接口是Servlet规范的一员,在同一个webapp,所有的servlet对象共享一个ServletContext对象,ServletContext对象在web服务器启动的时候创建,关闭的时候销毁
ServletContext对象对应的是整个web.xml配置文件
ServletContext接口的方法
getInitParameter(String name);通过name获取value
getInitParameterNames();获取所有的初始化参数的name
方法是获取的web.xml配置文件里的context-param标签的配置信息
getContextPath();获取应用的根路径
getRealPath(String path);获取文件的绝对路径
log(String messages);记录日志
log(String messages,Throwable t);
ServletContext对象又叫应用域:相当于缓存
满足:数据小,少修改,所有用户共享,这样的数据应该放到应用域

应用域的存,取,删的方法
setAttribute(String name;Object value);存
getAttribute(String name);取
removeAttribute(String name);删

HttpServlet(重点)

最终javaweb编写的Servlet实现类继承的是HttpServlet抽象类,继承关系是GenericServlet抽象类实现了Servlet接口和ServletConfig接口,HttpServlet抽象类继承了GenericServlet抽象类
HttpServlet类是专门为HTTP协议准备的,比GenericServlet更适合HTTP协议下的开发
前端发送的请求是GET,那么后端的方法只能重写doGet方法,否则报405

HttpServletRequest对象

HttpServletRequest接口是Servlet规范的一员,父接口是ServletRequest
HttpServletRequest对象又叫请求域对象,该对象封装了请求协议的全部内容,web服务器将请求协议解析的内容全部封装到HttpServletRequest对象当中
执行service方法会先调用带有ServletRequest对象参数的service方法,在该方法里会调用另一个带有HttpServletRequest对象参数的方法,该方法会根据请求协议的方式决定重写doGet或者doPost方法
HttpServletRequest对象的方法
getParameterMap();获取Map集合
getParameterNames();获取map集合的所有Key
getParameterValues(String name);根据name获取value
getparameter(String name);获取value这个一维数组中的第一个元素

其他常用方法
getRemoteAddr();获取客户端的IP地址
setCharacterEncoding(“UTF-8”);设置请求体的字符集
post请求乱码问题:response.setContentType(“text/html;charset=utf-8”);设置响应的字符集
getContextPath();获取应用的根路径
getMethod();获取请求方式
getRequestURI();获取请求的URI
getServletPath();获取请求的路径,不加项目名
get请求乱码问题:找到CATALINA_HOME下的conf下的server.xml配置文件,connector URIEncoding处设置字符集

请求域对象比应用域对象范围小,生命周期短,请求域只在一次请求有效,请求结束请求域对象就消失了,尽量使用域小的对象,占用的资源更小,域是缓存技术,减少IO流操作,提高效率
请求域对象的三个方法
setAttribute(String name,Object obj);向域中绑定数据
getAttribute(String name);向域中获取数据
removeAttribute(String name);将域中绑定的数据删除

HttpServletResponse对象

该对象是专门用来响应HTTP协议到浏览器的
方法
setContentType(“text/html;charset=utf-8”);设置响应的格式和字符集
PrintWriter out = getWriter();获取输出流的对象
out.print();输出内容到浏览器

最终Servlet开发步骤

第一步:编写实现类继承HttpServlet
第二步:重写doGet或者doPost方法,javaweb程序员决定
第三步:配置web.xml文件
第四步:准备前端HTML页面
第五步:启动web服务器,浏览器地址栏输入网址访问服务器

HTTP协议

HTTP概述

HTTP协议是:W3C万维网组织制定的一种超文本传输协议,所谓超文本就是流媒体,声音,视频,图片等

B/S之间遵循的HTTP协议,作用是解耦合,任意品牌的浏览器可以向任意品牌的服务器以HTTP协议的格式传输超文本

HTTP协议分为请求协议和响应协议
请求协议:浏览器向服务器传输超文本
包含四部分:请求行,请求头,空白行,请求体

响应协议:服务器向浏览器传输超文本
包含四部分:状态行,响应头,空白行,响应体

URL和URI

URL:是统一资源定位符,比如http://localhost:8080/servlet/postServlet
URI:是统一资源标识符,比如/servlet/postServlet
URL包含URI

GET和POST

GET发送请求的信息是在请求行上,显示在浏览器的地址栏上

POST请求发送的信息是在请求体上,不会显示在地址栏
只有在form表单中,method是POST方式,才算POST方式发送请求,其他一律是GET请求方式

当发送的请求是获取数据库的数据时,用GET
当发送的请求是向数据库发送(存储)数据时,用POST
正确使用GET请求和POST请求的情况下:GET请求是安全的,只是为了从服务器获取数据,POST请求是危险的,向服务器提交数据可能会被拦截监听

不管是GET还是POST都是以key,value形式发送

GET请求支持缓存:当用户发送请求时,先在本地缓存找,找不到才去服务器找,缓存机制是为了提高用户的体验
POST请求不支持缓存:响应的结果不会存入缓存,没有意义

web站点的欢迎页面

访问资源的时候默认访问我设置的欢迎页面,一个webapp可以设置多个欢迎页面,优先级是从上往下

欢迎页面可以是静态资源(xx.html),也可以是动态资源(java小程序)

tomcat服务器默认的欢迎页面
文件名是index.html和index.htm和index.jsp其中一个,那么默认的欢迎页面就是这个文件,不需要我们额外自己配置,这个叫全局配置
如果我们自己配置了欢迎页面,那么tomcat的全局配置就失效了,访问的是我们自己配置的欢迎页面,这个叫局部配置,优先级更高
全局配置的位置:conf下web.xml文件里

设置步骤
第一步:idea工具,在web目录下新建xx.html文件
第二步:在web.xml配置文件配置标签welcome-file-list,标签的路径默认从根开始查找,不要以斜号开始,直接写html的文件名字即可,比如xx.html,有目录结构加上即可
第三步:启动web服务器,浏览器输入网址访问即可

转发和重定向

在一个web应用中通过转发和重定向两种方法完成资源的跳转

转发

转发机制
将数据放到请求域当中,AServlet转发到Bservlet,保证两个servlet处于同一个请求
转发的不一定非得是servlet,只要是合法的资源都行,转发的路径以斜杠开始,不能加项目名

获取请求转发器
request.getRequestDISpatcher(“/b”)
调用转发器的forward方法完成转发
转发器对象.forward(request,response)

重定向

重定向的代码
response.sendRedirect(“/项目名/b”);

转发和重定向的区别

转发是一次请求,浏览器的地址栏不会改变,重定向是两次请求,浏览器的地址会改变
转发是request对象调用方法,重定向是response对象调用方法
转发是WEB服务器控制的,重定向是浏览器控制的
转发存在刷新问题,比如向数据库存入数据,刷新几次就重复的存几次
转发不需要加根路径,重定向需要加根路径

关于用转发还是重定向的问题

如果servlet对象在Servlet请求域中绑定了数据,希望从另一个servlet对象中获取绑定的数据,就使用转发机制
剩下的所有情况都使用重定向方式

Servlet注解开发

web.xml配置文件太过于臃肿,以注解的方式替代web.xml配置文件的配置

在Servlet类上使用注解@WebServlet,表示这个类是一个Servlet

@WebServlet注解的属性
name属性:指定servlet的名字
urlPatterns属性:指定servlet映射路径
loadOnStartUp属性:指定服务器启动阶段是否加载Servlet
value属性:作用跟urlPatterns属性一样,但是value属性名可以省略不写
注解的属性是一个数组,当数据只有一个元素,大括号可以省略不写
注解的结构是:key=value,key=value…

关于使用web.xml文件还是注解

如果配置信息经常改变的就写到web.xml,很少变动的用注解方式,注解简化开发

JSP概述

JSP是什么?
JSP是java程序,是一个Servlet规范,web服务器根据规范翻译jsp文件,本质上JSP是翻译引擎,每个web服务器都会内置一个JSP翻译引擎

JSP有什么用?
浏览器在地址栏访问JSP文件的时候,会自动翻译生成Java源文件,自动编译成class字节码文件
自动生成的类继承HttpjspBase类,而HttpjspBase继承HttpServlet类,JSP就是Servlet

JSP怎么用?
调试JSP,直接打开JSP对应的java源文件
JSP文件编写的代码会自动翻译到servlet类的service方法的out.write(“这里”)
在JSP文件编写的前段代码会被JSP当成普通的字符串,响应到浏览器,浏览器会对前段代码进行解析执行
JSP的page指令,设置响应的内容类型:<%@page contentType=“text/html;charset=utf-8”%>
JSP编写Java程序:<%Java语句%>,会翻译到service方法内部,就是在方法体写Java语句
<%! %>,在这里面编写的Java程序会被翻译到service方法外,类体里,就是在类体写java代码,很少用到存在线程安全问题
如果只是前端代码或者普通字符串,可以直接在JSP文件写,不用加<%%>
<%= %>,翻译后就是out.print();有变量的时候使用,动态内容,打印输出

service方法内置的九大对象之一的out,可以直接拿来用

Servlet和JSP的分工

Servlet负责接收请求,写逻辑业务,连接数据库

JSP负责响应处理好的数据

不管是Servlet还是JSP都是web服务器一手操控

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

gray rain

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值