一、什么是servlet?
servlet是Server Applet的缩写 译为”服务端小程序“,是一种Java语言来开发动态网站的技术
Servlet就是一个接口, 定义了Java类被浏览器访问到(tomcat识别)的规则。
将来我们自定义一个类,实现Servlet接口,复写方法也可完成接收用户的请求,处理用户的请求,响应信息给客户端,
-
Servlet是在服务器端运行的Java程序,可以接收客户端的请求并做出响应
-
Servlet可以动态生成HTML内容对客户端进行响应
-
Servlet与JSP的关系
-
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
-
JSP更擅长表现于页面显示,servlet更擅长于逻辑控制。
-
二、实现servlet的方法
实现servlet有三种方法
- 实现Javax.servlet.Servlet接口;
- 继承Javax.servle.GenericServlet类
- 继承Javax.servlet.http.httpServlet类【重点、因为我用的的就是这个、方便】
注解:用我的话来说,其实servlet就是一个处理逻辑的地方,因为规则上不允许jsp页面出现java代码,他本身是用来显示的,所以用到了servlet来处理逻辑,然后,将处理的结果再保存到一个域对象里去(后面再说),再回到jsp页面利用el表达式去调取
servelt使用详解
1、实现servlet接口
public interface Servlet{
public void init(servletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse resp) throws ServletException,IOException;
public String getServletInfo();
public void destory();
}
2、自定义一个类实现servlet接口,重写方法如下:
public class HelloServlet implements Servlet {
public LoginServlet1() {创建}
public void destroy() {销毁}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void init(ServletConfig arg0) {初始化}
public void service(ServletRequest arg0, ServletResponse arg1) {处理请求}
}
配置servlet映射路径,让浏览器访问这个映射路径,再通过这个映射路径去访问servlet
-
给servlet配置servlet路径,需要在web.xml中对servlet进行配置。
<!-- 配置servlet(HelloServlet) -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.zking.HelloServlet</servlet-class>
</servlet>
<!-- 映射servlet(HelloServlet) -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/请求路径</url-pattern>
</servlet-mapping>
<!-- 注意:但凡是改了web.xml文件的内容 务必记得重启服务器再运行!!! -->
大家会不会觉得这样很麻烦呢?没有关系 servlet3.0他来了
Servlet3.0
在Servlet3.0开始,可以通过注解的方式进行配置Servlet,不用在web.xml中再进行配置。
-
好处:
-
支持注解配此。可以不要web. xml了。
-
-
步骤:
-
创建JavaEE项目, 选择Servlet的版本3.0以上,可以不创建web . xml
-
定义一个类,实现Servlet接口
-
复写方法
-
在类上使用@WebServlet注解,进行配说
-
@webServlet("资源路径")| I
-
-
Servlet的生命周期
void init(ServletConfig):出生之后(1次)
void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
void destory():临时之前调用(1次)
【总结】servlet由我们编写,但对象由服务器来创建,并且由服务器来调用相应的方法。
Servlet提前执行init方法
默认情况地下,只有在初次访问Servlet时才会执行init方法。有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。这个时候就需要让init方法提前执行,免得影响初次访问的体验。
想要让init方法提前执行,需要在web.xml文件中对需要提前执行的Servlet进行设置
<!-- 向Tomcat注册Servlet servlet-name:Servlet的名称, servlet-class:具体的路径 --> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>cn.liuwei.servlet.TestServlet</servlet-class> <!-- 设置Servlet的init方法提前执行 --> <load-on-startup>2</load-on-startup> </servlet>
load-on-startup的值越小,提前执行的优先级越高。并且一般不设置为1,因为1是Tomcat的的Servlet的优先级
继承javax.servlet.http.HttpServlet类
HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。
创建HttpServlet步骤
-
继承HttpServlet抽象类
-
重写HttpServlet的部分方法,如doGet()或doPost()方法
-
获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
-
生成HTTP响应结果。通过HttpServletResponse对象生成响应结果
HttpServlet的实现由两种方式
实现方式一:.xml配置实现
A.配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复)
B.继承HttpServlet抽象类
C.重写get()、post()方法
实现方式二:注解实现
直接在Package包下新建Servlet
HttpServletRequest
Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。
-
HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口
【String getParameter(String name)】:根据name值得到value值
【String[ ] getParameterValues(String name)】:根据name值得到多个value值 例如:爱好【void setCharacterEncoding(String charset)】:设置请求的编码方式 防止中文乱码
【void setAttribute(String key, Object value)】:存值[键值对的方式]
【Object getAttribute(String key)】:根据键拿到值其中,getParameter是在ServletRequest中最常用的方法,可用于获取查询字符串的值。
HttpServletResponse
javax.servlet.ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
【void setContentType(String arg0)】:设置响应的编码方式
【PrintWriter getWriter()】:获得内置对象out
其中的getWriter方法,它返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象。默认情况下,PrintWriter对象使用ISO-8859-1编码(该编码在输入中文时会发生乱码)。
JSP页面表单提交方式
- 1.type="submit"
- 2.type="image"
- 3.使用链接来提交表单,javascript的DOM模型
- 4.通过onsubmit事件提交
- 5.通过ajax提交
<form action="请求路径url" method="get/post"></form>
表单提交有两种方式:
1.get(默认) 地址栏会显示信息,安全性低;有数据长度的限制
2.post 反之 以后推荐使用postget是用来从服务器上获得数据,而post是用来向服务器上传递数据。get可以在URL后面看见所提交的数据,但是Post是不会看见的!get安全性非常低,post安全性较高
页面跳转的方式
-
使用href超链接标记 客户端跳转
-
表单提交 客户端跳转
-
使用RequestDispatcher.forward()(转发) 服务器跳转
-
使用 response.sendRedirect()(重定向) 客户端跳转
-
使用forward动作标记 服务器跳转【后面将 JSTL】
-
使用response对象实现页面跳转的第二种方法,setHeader()方法【】
-
使用JavaScript 客户端跳转