Servlet

Posted howlet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet相关的知识,希望对你有一定的参考价值。



Servlet

Servlet是一个java接口,为我们封装好了处理HTTP请求的各种方法,而从达到浏览器和服务器的交互的目的


Tomcat

Tomcat是一个Servlet容器,能运行.class文件,也是Jsp容器能处理动态资源,还是Web服务器也就是说能处理Hmlt,Css等,Tomcat启动时读取webapps下web.xml文件里的信息,加载对应类,然后反射的实例化他们


常用的xml元素

<web-app> 
    <display-name></display-name>定义了WEB应用的名字 
    <description></description> 声明WEB应用的描述信息 
    
    <context-param></context-param> context-param元素声明应用范围内的初始化参数。 
    <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 
    <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 
    
    <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 
    
    <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。 
    
    <servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName.
    
    但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。 
 
    <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。 
    
    <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面
</web-app>

元素的配置

<listener> 
    <listerner-class>listener.SessionListener</listener-class> 
</listener>


<context-param> 
    <param-name>ContextParameter</para-name> 
    <param-value>test</param-value> 
    <description>It is a test parameter.</description> 
</context-param> 


<servlet>
    <servlet-name>ServletConfigTest</servlet-name>
    <servlet-class>pratices.ServletConfigTest</servlet-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>Howl</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ServletConfigTest</servlet-name>
    <url-pattern>/ServletConfigTest</url-pattern>
</servlet-mapping>


<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>


<error-page> 
    <error-code>404</error-code> 
    <location>/404.html</location> 
</error-page> 


<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


使用流程


  • 创建测试类实现Servlet接口,其中有五个方法
public class ServletTest implements Servlet {

    public void destroy() {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public String getServletInfo() {
        return null;
    }

    public void init(ServletConfig arg0) throws ServletException {

    }

    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

    }
}
  • 显然service() 是我们处理请求的地方,所以我们在Service()方法里面写入
arg1.getWriter().write("Hello World");  //字符流
  • 写完Service()是不够的,我们还需要让Tomcat知道该类在什么条件下会被调用

配置web.xml

<servlet>
    <!-- 配置一个名字 -->
    <servlet-name>ServletTest</servlet-name>
    <!-- 对应的Servlet类 -->
    <servlet-class>com.howl.controller.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
    <!-- 需要映射的Servlet名字 -->
    <servlet-name>ServletTest</servlet-name>
    <!-- 映射地址 -->
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
  • 输入对应的映射地址访问

技术图片


生命周期

  • 加载实例化:第一次访问该Servlet时加载对应的Class并且创建该实例,属于单例,但多线程

  • init:实例化后调用该函数初始化

  • service:浏览器访问该类时调用该函数

  • destory:Tomcat关闭或者主动调用destory该类会被销毁


HttpServlet

一般我们开发时继承HttpServlet类的,该类实现了Servlet的所有方法,并且添加了HTTP协议的处理方法,比Servlet更有优势,我么只需要重写doGet()和doPost()就可以

public class ServletTest extends HttpServlet {

    //处理Get请求
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    //处理Post请求
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}


ServletConfig

每个servlet都有这个对象,获取web.xml里面的配置初始化参数

ServletContext

代表着当前web站点,所有servlet共享该资源

ServletConfig sc = this.getServletConfig();
sc.getInitParameter("name");

ServletContext sct = this.getServletContext();
sct.getInitParameter("name");


HttpServletResponse

返回中文

//设置内部编码及浏览器显示编码
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("我爱中国");

下载

File file = new File("/download/test.png");

FileInputStream fileInputStream = new FileInputStream(file);
ServletOutputStream servletOutputStream = response.getOutputStream();

//设置响应头为下载
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

int length = 0;
byte[] bytes = new byte[1024];
while( (length = fileInputStream.read(bytes)) != -1 ){
    servletOutputStream.write(bytes, 0, length);
}
servletOutputStream.close();
fileInputStream.close();

重定向

response.sendRedirect("/404.html");//本地发生的,地址栏发生了变化

设置Cookie,Cookie的详细方法后面会介绍

void    addCookie(Cookie cookie)


HttpServletRequest

常用方法

request.setCharacterEncoding("UTF-8"); //设置POST获取参数的编码,get不行
request.getRemoteAddr       //发送请求的IP地址
request.getParameter("userId");     //获取参数
request.getAttribute()   //在request上存放数据,可用于转发
request.getRequestDispatcher.forward(request,response) //实现转发,服务器发生的,本地地址栏没变化

获取Cookie

Request.getCookies();  //获得一个数组,里面包含所有对象
Request.getSession();   //获取当前浏览器的Session


Http是无状态的,但Cookie会话技术就可以解决这个问题,当浏览器访问服务器时,服务器给浏览器颁发一个Cookie里面记录了相关信息,当浏览器再次访问该服务器时就会带上对应的Cookie,这样服务器就会认识你拉

构造函数

Cookie(java.lang.String name, java.lang.String value)

常见方法

String  getName()
String  getValue()
void    setValue(java.lang.String newValue)
int     getMaxAge()
void    setMaxAge(int expiry)
String  getPath()
void    setPath()
String  getDomain()
void    setDomain(java.lang.String pattern)

常见操作

//设置response的编码
response.setContentType("text/html;charset=UTF-8");

//实例化一个Cookie,注意导包是导入javax.servlet.http.Cookie,这个包在tomcat下
//URLEncoder在java.net包下,单参构造函数已废弃
Cookie cookie = new Cookie("name", URLEncoder.encode("我爱中国", "UTF-8"));

//设置过期时间,单位为秒,-1有效到浏览器关闭
cookie.setMaxAge(1000);

//设置额外二级域
cookie.setDomain("a.com");

//请求头添加set-cookie
response.addCookie(cookie);

//设置路径,一般cookie整个站点都可以用,但也可以只限制该地址可用
//cookie.setPath("/ServletConfigTest");

/*************************************/


//返回包含所有对象的数组
Cookie[] cookies = request.getCookies();

for(Cookie cookieLoop : cookies){
    String name = cookieLoop.getName();
    String value = URLDecoder.decode(cookieLoop.getValue(), "UTF-8");
    System.out.println(name + "----" + value);
}


HttpSession

Session也是解决http无状态的一种方式,Session能存放对象,并且Session是存在服务器端的,所以Servlet能共享属于某个浏览器的Session

只有当浏览器访问服务器的Servlet,并且使用了response.getSession()才会自动给该浏览器颁发一个带JESSIONID的Cookie,JESSIONID就是唯一标识浏览器Session的id,该cookie默认生命周期为当前浏览器,所以关闭了浏览器Session就会失效

Session的有效期是访问一次就重置,而cookie的是累计,Session存放于服务器内存,超时会自动删除,默认超时为30min

方法

long getCreationTime()      //获取Session被创建时间
String getId()              //获取Session的id
long getLastAccessedTime()          //返回Session最后活跃的时间
ServletContext getServletContext()          //获取ServletContext对象
void setMaxInactiveInterval(int var1)   //设置Session超时时间
int getMaxInactiveInterval()    //获取Session超时时间
Object getAttribute(String var1)    //获取Session属性,代替了getValue
Enumeration getAttributeNames()         //获取Session所有的属性名
void setAttribute(String var1, Object var2)     //设置Session属性
void removeAttribute(String var1)       //移除Session属性
void invalidate()       //销毁该Session
boolean isNew()         //该Session是否为新的

常见操作

HttpSession httpSession = request.getSession();
httpSession.setAttribute("Session", "Howl");
        
System.out.println(request.getSession().getAttribute("Session"));

//当浏览器禁止了Cookie的时候,encodeURL的另一个功能,带上JESSIONID访问即URL地址重写
//通过在其中包含会话ID对指定的URL进行编码,或者,如果不需要编码,则返回不变的URL
//之后服务器端会自动获取该ID
Response.encodeURL(java.lang.String url)

验证码

//getCode()获取验证码存入Session
request.getSession.setAttribute("code", getCode());

//然后和requset获取的对比
request.getAttribute(code) == request.getSession.getAttribute("code")





API参考 oracle官网文档

Web.xml参考 思否







以上是关于Servlet的主要内容,如果未能解决你的问题,请参考以下文章

servlet和filter的区别

Java基础——JSP

java---servlet与filter的联系与区别

servlet,filter,listener,intercepter区别

Tomcat根据JSP生成Servlet机制解析

servlet,过滤器,监听器,拦截器的区别