JSP中Servlet的使用(笔记)
JSP虽然为表示层中的视图层,但其是基于控制层的Servlet实现。
一、创建Servlet类
自己配置
1.Servlet基本格式
需继承HTTPServlet,同时我们需要做的仅为重载doGet与doPost方法。
doGet处理所有Get方式请求。
doPost处理所有Post方式请求。
(需检查该包是否在已buildpath的文件内,同上篇Eclipse中jsp与数据库基本(笔记)中导入JavaAPI注意内容一样)
package webtest;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class WelcomeServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{System.out.print("doGet\n");}protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{System.out.print("doPost\n");}
}
2. 2.5版本配置:同时需要在web.xml中添加,下图代码
1)对于servlet-mapping部分,其中url-pattern的WelcomeServlet为对应的请求链接名称,如当有下图写法时,自动将连接名称换为servlet-name中的名称。
2)之后会跳转到servlet部分,查找相同的servlet-name名称,而后转换为servlet-class的相对路径(同页面导入类/包一样写法)。
注意: 修改后请不要忘记重启服务器。此外,有时阿帕奇下项目的web.xml会被Eclipse下项目覆盖,有时又没有及时覆盖。
3. 3.0版本配置:直接在Java文件中编写@webServlet
package webtest;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@webServlet("/WelcomeServlet")//此处为url-parttern
public class WelcomeServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{System.out.print("doGet\n");}@Overrideprotected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{System.out.print("doPost\n");}
}
通过请求链接的名称扫描注解webServlet,匹配成功,则执行该类。
Eclipse自动配置
直接创建即可
测试能否使用
可以通过form方法测试能否使用。
二、服务器启动时自动执行init()
不修改默认访问时初始化。
2.5配置方式
通过在web.xml中加入以下代码段即可,数字代表第几个执行。
为查看效果重载init函数
@Overridepublic void init()throws ServletException{System.out.println("init");}
}
注意: 修改后请不要忘记重启服务器。此外,有时阿帕奇下项目的web.xml会被Eclipse下项目覆盖,有时又没有及时覆盖。
3.0配置方式
修改webServlet
@WebServlet(value ="/WelcomeServlet",loadOnStartup = 1)
三、Servlet继承关系
本篇为基于HTTP协议下的Servlet,上为父类,下为子类。
四、初始化值的获取
ServletConfig 接口
ServletContext getServletContext():获取Servlet上下文对象
- ServletContext为application对象所属的类,因此拥有方法与application一致
- 要注意的是,该方法在ServletConfig为抽象方法,具体的实现是在GenericServlet
String getInitParameter(String name);在当前Servlet范围内,获取名为name的初始化参数
- 对于ServletContext类中的String getInitParameter(String name):获取的为Web容器范围内的,命名为name的初始化参数。与此处方法仅是名字相同。
为了获取初始化值,同时比较两个getInitParameter方法,我们做以下准备。
2.5版本
1.此处于web.xml中设置web容器内的参数,以此在服务器启动时就拥有一个全局参数。
2.此处于web.xml中设置servlet容器内的参数,以此在服务器启动时就servlet就拥有一个变量。
注意: 修改后请不要忘记重启服务器。此外,有时阿帕奇下项目的web.xml会被Eclipse下项目覆盖,有时又没有及时覆盖。
3.0版本
web容器内的参数仍需要在web.xml中设置
servlet容器内参数需要在webServlet中添加
@WebServlet(value ="/WelcomeServlet",loadOnStartup = 1,initParams= {@WebInitParam(name = "ServletParamName",value = "servletvalue..")})
在XML中设置的变量自然也可以在eclipse中直接查看设置成功与否
执行代码如下
@Overridepublic void init()throws ServletException{System.out.println("init");//获取当前Servlet的初始化参数String value = super.getInitParameter("ServletParamName");System.out.println("当前Servlet的参数为ServletParamName:"+value);ServletContext servletContext = super.getServletContext();String globalValue = servletContext.getInitParameter("GlobalParam");System.out.println("当前Servlet的参数为GlobalParam:"+ globalValue);}
注意,如果没有成功读取,在确认了自己书写无误情况下,尝试清除服务器缓存或查看自己修改的web.xml是否是执行的对应的web.xml(eclipse如果不修改,新建项目时会默认在meta文件中重新生成一个镜像,其中的web仅在生成时被拷贝,之后修改互不干扰)
五、请求的处理
Service(ServletRequset req,ServletResponse res):处理请求。
-
该方法为Servlet提供,但是在HTTPService处被转成HTTP协议下的Service,即Service(HttpServletRequest req,HttpServletResponse res,同时将请求分类为doGet(),doPost()等方法。
-
此外Service在GenericServlet中为空实现。
-
HttpServletRequest为request对象所属的类,因此拥有方法与request一致
-
ServletResponse为response对象所属的类,因此拥有方法与response一致