1. Servlet使用配置
创建Servlet需要首先需要创建一个Servlet类,并且这个类需要继承HttpServlet,然后重写doGet()/doPost()方法实现业务逻辑流程。TestServlet.java代码如下:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("进入TestServlet。。。。。。。。。。。。。。。");
}
public void destroy() {
// TODO Auto-generated method stub
System.out.println("销毁TestServlet。。。。。。。。。。。。。。。");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("调用service()方法。。。。。。");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.append("welcome to ****");
//out.write("welcome to ****");
//out.println("welcome to ****");
out.flush();//缓冲区的数据强行输出
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用doGet()方法。。。。。。。。。。。。");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用doPost()方法.................");
}
}
其次需要配置Web.xml文件,在该文件中指定自定义的Servlet的信息即可。Web.xml中Servlet的配置信息如下:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.hyg.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
注意:
是自定义的servlet名称(唯一); 用于指定当前servlet所在的类路径 ; 用于指定进入当前servelt时访问的url地址。
2 . Servlet声明周期
Servlet生命周期概括为以下几个阶段:
- 装载Servlet:这项操作一般是动态执行的,有些服务器提供了相应的管理功能,可以在启动的时候就装载Servlet;
- 创建一个Servlet实例:容器创建Servlet的一个实例对象;
- 初始化:容器调用init()方法对Servlet实例进行初始化;1
- 服务:当容器接收到对此Servlet的请求时,将调用service()方法响应客户的请求; n
- 销毁:容器调用destroy()方法销毁Servlet实例 1
3. 重定向和请求转发
3.1 重定向
重定向是指页面重新定位到某个新地址,之前的Request失效,进入一个新的Request,且跳转后浏览器地址栏内容将变为新的指定地址。重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,其语法格式如下:
pubilc void sendRedirect(java.lang.String location)throws java.io.IOException
其中:
location参数指定了重定向的URL,它可以是相对路径也可是绝对路径。
sendRedirect()不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他应用程序中的资源,例如:
response.sendRedirect("http://www.baidu.com");
3.2 请求转发
请求转发是指将请求再转发到另一页面,此过程依然在Request范围内,转发后浏览器地址栏内容不变。请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应。
RequestDispatcher接口有两个方法:
forward()方法:请求转发,可以从当前Servlet跳转到其它Servlet;
include()方法:引入其他Servlet的内容。
RequestDispatcher是一个接口,通过使用HttpRequest对象的getRequestDispalcher()方法可以获得该接口的实例对象,例如:
RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request,response);
3.3 重定向和请求转发的区别
1、请求转发只能将请求转发给同一个Web应用中的组件,而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。
2、重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发访问过程结束后,浏览器地址栏保持初始的URL地址不变。
3、请求转发的调用者与被调用者之间共享相同的request对象和response对象;而重定向的调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。
4. Session
4.1 session生命周期
Session生命周期经过以下几个过程:
- 客户端向服务器第一次发送请求的时候,request中并无SessionID。
- 此时服务器会创建一个Session对象,并分配一个SessionID。Serssion对象保存在服务器端,此时为新建状态,调用session.isNew()返回true。
- 当服务器端处理完毕后,会将SessionID通过response对象传回到客户端,浏览器负责保存到当前进程中。
- 当客户端再次发送请求时,会同时将SessionID发送给服务器。
- 服务器根据传递过来的SessionID将这次请求(request)与保存在服务器端的Session对象联系起来。此时Session已不处于新建状态,调用session.isNew()返回false。
- 循环执行过程3-5,直到Session超时或销毁。
4.2 Session的常用方法
4.2.1 获取session
HttpSession session=request.getSession();//获取当前Session
4.2.2 在session中存取数据
用于存取数据的方法有:
² setAttribute():用于在Session对象中保存数据,数据以Key/Value映射形式存放。
² getAttribute():从Session中提取指定Key对应的Value值。
向Session对象中保存数据的示例代码如下:
//将username保存到Session中,并指定其引用名称为uName
session.setAttribute("uName", username);
从Session中提取存放的信息,则代码如下:
//取出数据,注意:因该方法的返回数据类型为Object,所以需要转换数据类型。
String username = (String)session.getAttribute("uName");
4.2.3 销毁session
用于销毁Session的方法是:
² invalidate():调用此方法可以同时删除HttpSession对象和数据。
使用invalidate()销毁Session的示例代码如下:
//销毁Session(常用于用户注销)
session.invalidate();
5. ServletContext接口
Servlet上下文是运行Servlet的逻辑容器。同一个上下文中的所有Servlet共享存于其中的信息和属性。在Servlet API中定义了一个ServletContext接口,用于存取Servlet运行的环境或者上下文信息。ServletContext对象可以通过使用ServletConfig对象的getServletContext()方法获得,在Servlet中提供了getServletContext()方法也可以直接获得ServletContext对象。
ServletContext ctx = this.getServletContext();
ServletContext接口中定义了许多有用的方法,其中getAttribute()、setAttribute()、removeAttribute()和getInitParameter()是在Web开发中比较常用的方法。
Integer counter = (Integer) ctx.getAttribute("UserNumber");
tx.setAttribute("UserNumber", counter);
5.1 ServletContext的生命周期
ServletContext的生命周期过程如下:
1) 新Servlet容器启动的时候,服务器端会创建一个ServletContext对象;
2) 在容器运行期间ServletContext对象一直存在;
3) 当容器停止时,ServletContext的生命周期结束。
5.2 ServletContext的配置和使用
Web.xml的配置信息如下:
<!-- servletContext初始化配置 -->
<context-param>
<param-name>url</param-name>
<!--<param-value>jdbc:mysql://localhost:3306/servlet</param-value> -->
<param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value>
</context-param>
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver/oracle.jdbc.driver.OracleDriver</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>yjx</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>yjx123</param-value>
</context-param>
TestServletContextServlet.java中的代码如下:
// 获得ServletContext对象
ServletContext ctx = this.getServletContext();
// 获得web.xml中设置的初始化参数 连接数据库的基本信息
String url = ctx.getInitParameter("url");
url = url + "?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
String driver = ctx.getInitParameter("driver");
String user = ctx.getInitParameter("user");
String password = ctx.getInitParameter("password");
6. 监听器
Servlet监听器的作用是监听Servlet应用中的事件,并根据需求作出适当的响应。Listener接口和Event类
监听对象 Listener Event
监听Servlet上下文 ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
监听Session HttpSessionListener HttpSessionEvent
HttpSessionActivationListerner
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener
监听Request ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent
6.1 监听器配置
在web.xml中配置监听器的格式如下:
<listener>
<listener-class>监听类</listener-class>
</listener>
例如:
com.hyg.listener.OnlineSessionListener
6.2 监听器的使用
以监听session为例,统计当前在线人数,创建一个监听器,实现HttpSessionListener接口,并重写接口方法,具体代码如下所示:
public class OnlineSessionListener implements HttpSessionListener {
private static long onlineNumber = 0;//在线人数
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("在线人数监听启动....");
onlineNumber++;
//设置当前session最大生效时间
//se.getSession().setMaxInactiveInterval(5);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("在线人数监听销毁....");
onlineNumber--;
}
public static long getOnlineNumber() {
return onlineNumber;
}
}
当在服务器启动的时候就会触发监听器,此时会调用sessionCreate()方法,当用户关闭浏览器并且session有效时间过期的时候,才会触发 sessionDestroye()方法。
7. 过滤器
过滤器(Filter)技术是Servlet 2.3规范新增加的功能,作用是用于过滤、拦截请求或响应信息,可以在Servlet或JSP页面运行之前和之后被自动调用,从而增强了Java Web应用程序的灵活性。
7.1 过滤器的过滤过程
当用户发送请求后,运行的步骤如下:
- 浏览器根据用户的请求生成HTTP请求消息,并将其发送给Web容器。
- Web容器创建针对该次访问的请求对象(request)和响应对象(response)。请求对象中包含了HTTP的请求信息,响应对象用于封装将要发送的HTTP响应信息,此时的响应对象中的内容为空。
- Web容器在调用Web组件之前(Servlet、JSP或HTML)把request对象和response对象传递给过滤器。
- 过滤器对request对象进行处理(如获取请求的URL等),一般不对response对象进行处理。
- 过滤器把处理后的request对象和可能没有处理的response对象传递给Web组件。
- Web组件调用完毕后,再次经过该过滤器,此时过滤器可能对response对象进行特殊处理(如设置响应报头或内容压缩等操作)。
- 过滤器把response对象传递给Web容器。
- Web容器把响应的结果传递给浏览器,并由浏览器显示响应结果。
在实际的应用中,可以使用过滤器来完成以下任务:
² 访问特定资源(HTML、JSP页、Servlet)时的身份认证,禁止用户非法访问;
² 应用程序级资源的访问审核和记录;
² 应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上;
对被访问资源的及时转换,包括从Servlet和JSP的动态输出等。
7.2 过滤器配置
在Web.xml中添加如下配置信息:
<!-- 过滤器配置 -->
<filter>
<display-name>LoginFilter</display-name>
<filter-name>LoginFilter</filter-name>
<filter-class>com.hyg.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意: /* 表示拦截所有url路径。
7.2 过滤器的使用
要创建一个过滤器,必需要实现Filter接口,并实现接口中的方法。以URL地址过滤为例,其实现代码如下:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//剔除不需要过滤的页面
String path = req.getRequestURI();
req.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
if (path.endsWith("login.jsp") || path.endsWith("login.action") || path.endsWith("register.jsp") || path.endsWith("register.action")) {
chain.doFilter(req, resp);
return;
}
//校验是否登录用户
HttpSession session = req.getSession();
String userName = (String)session.getAttribute("userName");
if(StringUtils.isEmpty(userName)){
resp.sendRedirect("login.jsp");
return;
}
chain.doFilter(req, resp);
}