- 创建数据库中的User表以及表数据
- 创建项目
默认会为我们选择配置好的tomcat版本,因为我们使用的servlet是一个服务器语言,你要写servlet必须要在服务器中来写,因此必须选择服务器。
版本2.5,相比其他版本多了一个web.xml的配置文件,这个配置文件就是用来配置你写的servlet的
项目的目录结构:
Java表示Java后台代码书写,webcontent表示项目的根目录,也就是路径中项目名后面的/
Web.xml中都是我们索要理解的配置文件。
然后根据要求,下面我们先看看servlet
servlet的概念
全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet运行于支持Java应用的服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
3.2 servlet的工作原理
1)用户(客户端)通过一个URL来请求一个Servlet
2)当用户请求Servlet时,容器构建ServletRequest对象 request和ServletResponse对象response,并传递给Servlet的service()方法,service通过request对象获取到请求的参数,然后,根据参数做出相应的处理,通过response对象来向客户端发送相应内容。
实现交互式的浏览和修改数据,生成动态web内容的过程:
1)客户端发送请求到服务器端
2)服务器将信息发送给servlet
3)Servlet生成响应的内容将其给服务器,响应的内容动态生成的,其实取决于客户端的请求
4)服务器响应返回给客户端
注意:我们现在写的servlet其实就是一个普通类,然后继承了httpservlet
3.3 servlet的生命周期
1)加载类,生命周期开始
2)调用init()方法,进行初始化;Servlet在服务器中只有一个实例,所以只初始化一次
3)执行service()方法(或根据请求的不同调用doGet()/doPost()方法)
4)销毁,调用destroy()方法
3.4 第一个servlet程序
1)新new一个dynamic web project ,然后填写项目名并且选择服务器(因为servlet运行在服务器上面的)选择版本2.5(因为2.5会自动生成一个web.xml的配置文件,3.0版本需要手动选择)
2)在src下面创建包和类(fristServlet),然后继承: httpservlet(import javax.servlet.http.HttpServlet;),然后重写init方法、destroy()方法、service方法
3)配置web.xml
先配置本地路径:
然后配置网络路径:
我们在浏览器中如果需要访问servlet,我们需要写servlet中对应的映射到路径:
4)运行项目,在浏览器地址中输入http://localhost:8080/ServletXingMu/frist.do这里有个问题就是一开始进入项目报404,因为我们没有设置首页
5)查看控制台的结果
停止服务器查看结果:
常见错误:
如果servlet的网络映射路径一旦写错了,tomcat就启动不起来会报这个问题,显示启动失败。
1.上下名称不一致
2./没有加
注意:一旦修改了web.xml就需要重新启动服务器
说明:/ 表示根目录,也就是http://localhost:8080/Servlet_day01/这 个路径项目名后的/ 所以根据配置的映射路径访问名为first的servlet时路径为:http://localhost:8080/Servlet_day01/first.do
3.5 Servlet中的doGet()和doPost()方法
Servlet中初始化方法和销毁方法可以不写,运行服务器会自动运行,以后我们只需要写service方法就可以了。Service方法中还有doget和dopost方法,关系:servlce=doget+dopost。
doget方法专门用来处理以get方式发送的请求,dopost方法专门用来处理以post方式发送的请求,当然不管get也好post也好都可以使用service方法。如果我们以get方式发送请求,那么在对应的servlet中会先找doget方法,如果没有才会去找service方法,如果我们以post方式发送请求,那么在对应的servlet中会先找dopost方法,如果没有才会去找service方法;也就是说service方法可以一个顶两。
3.5.1 常用的传输协议方式
HTTP传输协议常用的两种方式:Get和Post;
get方式和post方式统称传输方式,那么如何决定传输方式?
1)在地址栏中直接输入地址是以get方式发送请求的
2)超链接是通过get方式发送的请求
3)表单提交有两种方式:
Get方式提交:是通过get方式发送的请求
Post方式提交:是通过post方式发送的请求
例子:
创建项目JavaEE_day02,注意:选择服务器7.0以及以上和版本号2.5,在webContent下面的wen-inf下面的web.xml配置文件中修改首页为login.html,创建login.html,在页面中填写from表单以及超链接。
在src中创建Java servlet类,类名SecondServlet,继承于httpservlet(import javax.servlet.http.HttpServlet)
重写doget和dopost方法
如果我们需要访问当前的servlet那么我们就需要进行配置,在web.xml中进行配置
进行访问,在地址栏中输入http://localhost:8080/JavaEE_day02/second.do然后在控制台输出得到结果:
说明我们在地址栏中发送请求的发送为get方式。
使用超链接方式,在页面中填写链接地址
注意:超链接的链接路径和表单提交的路径都是相对路径,点击超链接,网址由
http://localhost:8080/JavaEE_day02/变为http://localhost:8080/JavaEE_day02/second.do说明我们正在访问secondservlet这个类。
结果:
说明超链接也是get方式发送的请求。
表单的中发送请求的方式由我们自己决定的,填写表单信息
首先地址由http://localhost:8080/JavaEE_day02
变为http://localhost:8080/JavaEE_day02/second.do?loginname=qwe&password=123(明文)
在路径后面加参数:在项目路径后面+?属性名=属性值&属性名=属性值&。。。&。。。
结果:
也就是说如果我们在method中赋值为get的话,那么它是以get方式发送的请求。
将method中的get值修改为post
然后接着访问看结果。(如果显示不出来注意清除缓存)地址栏由
http://localhost:8080/JavaEE_day02/变为http://localhost:8080/JavaEE_day02/second.do里面少了参数的值(暗文)
结果:
也就是说如果我们在method中赋值为post的话,那么它是以post方式发送的请求。
注意:我们在发送请求的时候要么是get要么是post两者选一,所以说doget和都post中的内容是一致的,那么我们是不需要写两遍,方法互调。
常见的错误:405原因:是因为缺少对应的方法。
将doget和dopost方法屏蔽,放出service方法
然后接着访问当前的servlet,无论如何访问最终结果都是调用的service方法
总结:service=doget+dopost
3.6 serlvet的常用API
serlvet的常用API有两个包组成
3.6.1 javax.servlet包:跟http请求无关的一般性servlet
1)ServletContext
使用request对象来获取ServletContext对象;有两个常用方法:getInitParameter(变量名)方法,获取指定变量名的变量值;getInitParameterNames()获取所有的变量名,以集合的形式返回,使用迭代器遍历即可;
使用ServletContext来设置全局变量,也就是说只有服务器不停止,在任何一个浏览器,同一个Web项目中任何一个Servlet中都能访问到变量。
例子:
访问结果:
其他servlet访问全局变量:
创建ThirdServlet,重写doget和dopost方法
配置当前servlet
访问当前servlet,直接在浏览器中输入相应的地址
http://localhost:8080/JavaEE_day02/third.do
结果:
说明全局变量可以在任何一个servlet中被访问到,如果不知道变量名的情况下我们可以先获取变量名,然后在通过变量名来获取变量值。
获取变量名--使用servletcontext对象调用对应的方法
直接对当前servlet进行访问,得到结果:
同一个Web项目中的所有Servlet都可以获取到一般用于设置servlet之间的共享参数,或设置web应用中的初始参数等等;
2)ServletConfig
使用this就表示ServletConfig类型的对象;有两个常用方法:getInitParameter(变量名)方法,获取指定变量名的变量值;getInitParameterNames()获取所有的变量名,以集合的形式返回,使用迭代器遍历即可;
在哪个<servlet></servlet>标签中设置的变量,那该<servlet></servlet>是配置的哪个Servlet,就只能被哪个Servlet获取到设置的变量;即只能被当前Servlet访问到,不能被其他Servlet访问到;一般用于处理该servlet在配置文件中的配置信息
例子:
那只能在SecondServlet中被访问到:
重新启动服务器,然后对当前servlet进行访问
在不同的servlet中访问局部变量,就是将刚刚写的代码复制到thirdservlet中
结果:
在不同servlet中不能访问局部变量。
3.6.2 Javax.servlet.http包:跟http协议相关的类
自定义servlet继承自的HttpServlet(就属于该包下);Servlet接口决定了servlet的生命周期;以及两个常用接口HttpServletRequest(用来获取HTPP请求信息)和HttpServletResponse(用来提供HTTP响应);
常用方法:
getParameter(变量名):用来获取请求中的参数的方法
如何获取请求中的信息?
1)获取地址栏中信息:地址栏中的变量名来获取的。
例子:
1.创建项目javaEE_day05
2.创建FourServlet,继承于httoservlet,重写doget合dopost方法,在dopost中调用doget方法
3.在web.xml中配置当前servlet的映射路径
4.在servlet中使用方法来获取地址栏中参数(信息)
5.运行项目,在浏览器中输入
http://localhost:8080/JavaEE_day05/four.do
结果:
没有值是因为我们在浏览器中没有给出请求信息,也就是说
这里面的qwe变量名不存在,在地址栏中将参数变量加上,输入
http://localhost:8080/JavaEE_day05/four.do?qwe=qwe,结果:
说明我们使用此方法可以获取地址栏中请求信息
2)获取表单中的字段值:是提供name属性中属性值来获取的
例子:
1.设置首页,创建首页login.html,在首页中创建from表单
2.在servlet中获取表单的信息
3.运行项目,在页面中输入用户名和密码,点击提交
输入的地址:http://localhost:8080/JavaEE_day05/
跳转的地址:http://localhost:8080/JavaEE_day05/four.do
结果:
说明我们页面中输入的信息已经在后台获取出来了。
思考:如果遇到爱好,性别这些同名参数怎么办?
我们需要使用getParameterValues()方法:用来获取同名参数的value值
1.在servlet中写
2.在页面中添加多选
3.运行项目,选择男或者女
结果:
说明使用getParameterValues可以获取到同名参数的value值。