servlet快速笔记

2018-10-28  本文已影响0人  61etj

Servlet

当Servlet小于2.5时,需要填写配置文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB13</display-name>
  
    //配置servlet
  <servlet>
    <servlet-name>abc</servlet-name>
    <servlet-class>com.itheima.servlet.QuickStratServlet</servlet-class>
    <init-param>
        <param-name>url</param-name>
        <param-value>aaa</param-value>
    </init-param>  
    
    //配置servlet在服务器启动时创建对象,优先级取值为[1,5],数字越小越高
    //Servlet默认第一次访问Servlet时创建
    <load-on-startup>3</load-on-startup>
</servlet>

    //配置映射
  <servlet-mapping>
    <servlet-name>abc</servlet-name>
    //1完全匹配
    <url-pattern>/quickStratServlet</url-pattern>
    //2目录匹配 代表访问a目录下的b的任意资源
    <url-pattern>/a/b/*</url-pattern>
    //3扩展名匹配 代表访问任意以aaa为后缀的文件
    <url-pattern>*.aaa</url-pattern>
    //注意2和3不要混用

    //缺省的servlet,当所有的资源请求都没有匹配时,使用缺省servlet
    <url-pattern>/</url-pattern>
    //注意:使用缺省会无法正常访问普通的静态资源,因为项目的缺省映射将Tomcat的全局缺省映射覆盖了,而所有静态资源输出都是又Tomcat的缺省servlet做的,所有的响应都是由servlet负责,包括静态资源。

  </servlet-mapping>

    //默认打开网页格式
  <welcome-file-list>
    <welcome-file>1.html</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

创建Servlet实例

//实现Servlet
public class QuickStratServlet implements Servlet{

    //Servlet默认第一次访问Servlet时创建
    @Override
    public void init(ServletConfig config) throws ServletException {
        //ServletConfig config 是 servlet 的配置信息

        //1、获得servlet的name----<servlet-name>abc</servlet-name>
        String servletName = config.getServletName();
        System.out.println(servletName);//abc

        //2、获得该servlet的初始化的参数(来源于配置文件)
        String initParameter = config.getInitParameter("url");
        System.out.println(initParameter);

        //3、获得Servletcontext对象
        ServletContext servletContext = config.getServletContext();
        
        System.out.println("init running....");
    }
    
    //每次请求都会经过此方法
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("QuickStratServlet running....");
        res.getWriter().write("QuickStratServlet running....");
    }
    
    //服务器关闭Servlet销毁的时候会执行
    @Override
    public void destroy() {
        System.out.println("destroy running....");
    }
    
    
    
    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }


}

域对象

概念

存储数据区域及是域对象,类似于一个全局的仓库,给web资源共享数据使用


ServletContext

概念

代表当前web应用的环境上下文对象,ServletContext对象内部封装是该web应用的信息,一个web应用只存在一个ServletContext对象。

域对象固有方法
void setAttribute(String key,Object value);//存入数据
Object value = getAttribute(String key);//取出数据
removeAttribute(String key);//移除数据

生命周期

创建:当前web应用被加载(服务器启动或发布web应用)
销毁:web应用被卸载(服务器关闭,移除该web应用)

1. 获取web应用全局初始化参数 
    
    - 配置

            //web.xml配置,在<web-app>根节点下
            <context-param>
                <param-name>driver</param-name>
                <param-value>com.mysql.jdbc.Driver</param-value>
            </context-param>

    - 获取

            ServletContext context = getServletContext();
            String initParameter = context.getInitParameter("driver");

2. 获取web应用中任何资源的绝对路径

        //通过相对地址 (web项目相对地址) 获取绝对路径
        String path = getRealPaht(String path);

        //通过类加载器来通过相对地址 (class相对地址) 来获取绝对路径
        String path = ContextServlet.class.getClassLoder().getResource(String path).getPath();

        getMimeType(String filename);//根据文件名自动判断类型并返回
    
3. 域对象

    > ServletContext域对象的作用范围:整个web应用中所有的web资源
    > (servlet,jsp..)都可以随意向ServletContext存取数据,达成数据共享。

        void setAttribute(String key,Object value);//存入数据
        Object value = getAttribute(String key);//取出数据
        removeAttribute(String key);//移除数据

HttpServletResponse

页面响应对象,用于写页面

使用
setStatus(int statusCode);//设置状态码
addHeader(String name,String value);//增加响应头
addIntHeader(String name,int value);//一般用于设置数据长度
addDateHeader(String name,long date);//一般用于设置时间
setHeader(String name,String value);
setDateHeader(String name,long date);
setIntHeader(String name,int value);

//重定向
setStatus(302);
setHeader("Location","/WEB14/servlet2");

//重定向简写
sendRedirect(String url);

//定时刷新,延时5秒重定向到百度
setHeader("refresh","5;url=http://www.baidu.com");

setCharacterEncoding("UTF-8");//设置编码,此方法必须在getWriter前使用才有效
setHeader("Content-Type","text/html;charset=UTF-8");//设置浏览器使用UTF-8来解析,同时此方法包含setCharacterEncoding,也会对输出设置编码
setContentType("text/html,charset=UTF-8");//同上,快捷写法
PrintWriter getWriter();//获取字符输出流

getOutputStream();//获取字节输出流,不能与getWriter()同时出现否则会报错

setHeader("Content-Disposition","attachment;filename="+filename);//下载的文件名

HttpServletRequest

网页请求对象,用于获取请求信息

使用

String getMethod();//获取请求协议
String getRequestURI();//获取请求资源地址(相对)
String getRequestURL();//获取网络请求地址
String getContextPath();//获取web应用名称
String getQueryString();//get提交的参数字符串       

String getRomoteAddr();//获得客户端的ip地址

long getDateHeader(String name);//获取时间请求头
String getHeader(String name);//获取请求头
Enumeration getHeaderNames();//获取请求头名字的枚举
Enumeration getHeaders(String name);//获取请求头中值的枚举
int getIntHeader(String name);

String getParameter(String name);//获取参数
String[] getParameterValues(String name);//获取多个参数
Enumeration getParameterNames();//获取所有参数名枚举
Map<String,String[]> getParameterMap();//获取参数键值对

//转发
RequestDispatcher getRequestDispatcher(String path);//获得一个请求转发器
forward(ServletRequest request,ServletResponse response)
参数出现乱码

原因:post参数是保存在流内而get参数保存在地址,所以Post设置setCharacterEncoding即可将流内参数编码设置好,而get只能通过将iso8859-1转换为utf-8来解决

//如果是Post参数出现乱码设置request编码即可
request.setCharacterEncoding("UTF-8");

//如果是get参数出现乱码,也适用于Post
new String(username.getBytes("iso8859-1"),"UTF-8");

Cookie

客户端会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个,Cookie仅能存非中文字符串

Cookie cookie = new Cookie(String cookieName,String cookieValue)
response.addCookie(Cookie cookie);

如果不携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

setPath(String path);//设置Cookie携带路径

持久化,如果不设置持久化时间,cookie会存储在浏览器内存中,浏览器关闭cookie信息销毁,如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

setMaxAge(int seconds);//设置持久化时间

获取cookie

Cookie[] cookies = request.getCookies();//通过request获取所有cookie
if(cookies!=null){
    for(Cookie coo : cookies){
        coo.getName();//通过遍历获取Cookie的key
        coo.getValue();//通过遍历获取Cookie的value
    }

}

Session

服务器会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个。

此技术是基于cookie,cookie储存了session编号---JSESSIONID

HttpSession session = request.getSession();//获取当前会话的session对象,服务器不存在该session则创建,存在则获取
String getId();//获取JSESSIONID

//域对象固有方法传递共享数据
void setAttribute(String key,Object value);//存入数据
Object value = getAttribute(String key);//取出数据
removeAttribute(String key);//移除数据 

生命周期

持久化

将JSESSIONID的cookie持久化

上一篇 下一篇

猜你喜欢

热点阅读