Servlet(一)学习笔记(Tomcat、Servlet)

Servlet(一)

Tomcat

目录结构

bin 主要存放二进制可执行文件和脚本。
conf 主要存放各种配置文件。
lib 主要用来存放Tomcat运行需要加载的jar包。
logs 主要存放Tomcat在运行过程中产生的日志文件。
temp 主要存放Tomcat在运行过程中产生的临时文件。
webapps 主要存放应用程序,当Tomcat启动时会去加载该目录下的应用程序。
work 主要存放tomcat在运行时的编译后文件,例如JSP编译后的文件。

启动和关闭

启动方式
使用bin目录下的批处理文件startup.bat来启动Tomcat服务器,若出现一个毫秒数说明启动成功。
关闭方式
使用bin目录下的批处理文件shutdown.bat来关闭Tomcat服务器。

注意事项
启动之前首先安装JDK并配置环境变量JAVA_HOME,若希望Tomcat服务器可以在任意路径启动,则需要配置环境变量CATALINA_HOME。
启动信息乱码的处理方式:logging.properties文件修改为java.util.logging.ConsoleHandler.encoding = GBK

配置文件

server.xml文件是服务器的主配置文件,可以设置端口号、设置域名或IP、默认加载的项目、请求编码等。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

tomcat-users.xml文件用来配置管理Tomcat服务器的用户与权限 。

<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="manager-gui"/>

Servlet的概念和使用

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写的服务器端程序,换句话说,Servlet就是运行在服务器上的Java类。
Servlet用来完成B/S架构下客户端请求的响应处理,也就是交互式地浏览和生成数据,生成动态Web内容。

Servlet的编程步骤

建立一个Java Web Application项目并配置Tomcat服务器。
自定义类实现Servlet接口或继承 HttpServlet类(推荐) 并重写service方法。
将自定义类的信息配置到 web.xml文件并启动项目,配置方式如下:


<servlet>
  
<servlet-name> HelloServlet servlet-name>
  
<servlet-class> com.szx.demo02.HelloSrevlet servlet-class>
servlet>

<servlet-mapping>
  
<servlet-name> HelloServlet servlet-name>
  
<url-pattern> /hello url-pattern>
servlet-mapping>

在浏览器上访问的方式为:

http://localhost:8080/工程路径/url-pattern的内容

创建Servlet的三种方式

Servlet接口

javax.servlet.Servlet接口用于定义所有servlet必须实现的方法。

void init(ServletConfig config) 由servlet容器调用,以向servlet指示servlet正在被放入服务中
void service(ServletRequest req,ServletResponse res) 由servlet容器调用,以允许servlet响应请求
ServletConfig getServletConfig() 返回ServletConfig对象,该对象包含此servlet的初始化和启动参数
String getServletInfo() 返回有关servlet的信息,如作者、版本和版权
void destroy() 由servlet容器调用,以向servlet指示该servlet正在退出服务

public class HelloSrevlet implements Servlet {
     
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
     

    }

    @Override
    public ServletConfig getServletConfig() {
     
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
     
        System.out.println("接收到了浏览器的请求,并做出了响应!!");
    }

    @Override
    public String getServletInfo() {
     
        return null;
    }

    @Override
    public void destroy() {
     

    }
}

    <servlet>
        
        <servlet-name>HelloSrevletservlet-name>
        
        <servlet-class>com.szx.demo02.HelloSrevletservlet-class>
    servlet>

    
    <servlet-mapping>
        <servlet-name>HelloSrevletservlet-name>
        
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
GenericServlet类

javax.servlet.GenericServlet类主要用于定义一个通用的、与协议无关的servlet,该类实现了Servlet接口。
若编写通用servlet,只需重写service抽象方法即可。

abstract void service(ServletRequest req,ServletResponse res) 由servlet容器调用允许servlet响应请求

public class HelloServlet2 extends GenericServlet {
     
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
     
        System.out.println("继承GenericServlet类的方式创建servlet");
    }
}

    <servlet>
        
        <servlet-name>HelloSrevlet2servlet-name>
        
        <servlet-class>com.szx.demo02.HelloServlet2servlet-class>
    servlet>

    
    <servlet-mapping>
        <servlet-name>HelloSrevlet2servlet-name>
        
        <url-pattern>/hello2url-pattern>
    servlet-mapping>
HttpServlet类

javax.servlet.http.HttpServlet类是个抽象类并继承了GenericServlet类。
用于创建适用于网站的HTTP Servlet,该类的子类必须至少重写一个方法。

void doGet(HttpServletRequest req,HttpServletResponse resp) 处理客户端的GET请求
void doPost(HttpServletRequest req,HttpServletResponse resp) 处理客户端的POST请求
void init() 进行初始化操作
void service(HttpServletRequest req,HttpServletResponse resp) 根据请求决定调用doGet还是doPost方法
void destroy() 删除实例时释放资源

public class HelloServlet3 extends HttpServlet {
     
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        System.out.println("这是采用继承HttpServlet创建的servlet,以后开发中推荐!");
    }
}

    <servlet>
        
        <servlet-name>HelloSrevlet3servlet-name>
        
        <servlet-class>com.szx.demo02.HelloServlet3servlet-class>
    servlet>

    
    <servlet-mapping>
        <servlet-name>HelloSrevlet3servlet-name>
        
        <url-pattern>/hello3url-pattern>
    servlet-mapping>

servlet的生命周期

Servlet(一)学习笔记(Tomcat、Servlet)_第1张图片

构造方法只被调用一次,当第一次请求Servlet时调用构造方法来创建Servlet的实例。
init方法只被调用一次,当创建好Servlet实例后立即调用该方法实现Servlet的初始化。
service方法被多次调用,每当有请求时都会调用service方法来用于请求的响应。
destroy方法只被调用一次,当该Servlet实例所在的Web应用被卸载前调用该方法来释放当前占用的资源。

public class HelloServlet3 extends HttpServlet {
     
    public HelloServlet3() {
     
        System.out.println("构造方法调用。。。");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        System.out.println("这是采用继承HttpServlet创建的servlet,以后开发中推荐!");
    }

    @Override
    public void destroy() {
     
        System.out.println("销毁操作开始。。。");
    }

    @Override
    public void init() throws ServletException {
     
        System.out.println("初始化开始咯。。");
    }
}

POST和GET请求

GET请求

发出GET请求的主要方式:
在浏览器输入URL按回车
点击超链接
点击submit按钮,提交method="get"表单
GET请求特点:
会将请求数据添加到请求URL地址的后面,只能提交少量的数据、不安全

@WebServlet(name = "HelloServlet4",urlPatterns = "/hello4")
public class HelloServlet4 extends HttpServlet {
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        System.out.println("Post请求方式。。。");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        System.out.println("Get请求方式。。。");
        this.doPost(request,response);
    }
}
<body>
    
    <a href="hello4">测试Get请求a>
    
    <form action="hello4" method="get">
        <input type="submit">
    form>
body>

POST请求

发出POST请求的方法如下:
点击submit按钮,提交 method="post"表单
POST请求的特点:
请求数据添加到HTTP协议体中,可提交大量数据、安全性好


    <form action="hello4" method="post">
        <input type="submit">
    form>

请求参数的获取两种方式

ServletRequest接口

javax.servlet.ServletRequest接口主要用于向servlet提供客户端请求信息,可以从中获取到任何请求信息。
Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servlet的service方法。

String getParameter(String name) 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值
String[] getParameterValues(String name) 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值
Enumeration getParameterNames() 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举
Map getParameterMap() 返回请求参数的键值对,一个键可以对应多个值
String getRemoteAddr() 返回发送请求的客户端或最后一个代理的IP地址
int getRemotePort() 返回发送请求的客户端或最后一个代理的端口号

方式一
public class ParameterServlet extends HttpServlet {
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        //获取指定参数名称对应参数
        String name = request.getParameter("name");
        System.out.println("获取到的姓名:" + name);
        String age = request.getParameter("age");
        System.out.println("获取到的年龄:" + age);
        String[] hobbies = request.getParameterValues("hobby");
        System.out.print("获取到的爱好有:");
        for (String ts : hobbies){
     
            System.out.print(ts + "  ");
        }
        System.out.println();
        System.out.println("------------------------------------");
        //获取所有参数的名称
        Enumeration<String> parameterNames = request.getParameterNames();
        System.out.print("获取所有参数的名称为:");
        while (parameterNames.hasMoreElements()){
     
            System.out.print(parameterNames.nextElement() + "   ");
        }
        System.out.println();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        this.doPost(request,response);
    }
}
<body>
<form action="parameter" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    爱好:<input type="checkbox" name="hobby" value="java">Java
            <input type="checkbox" name="hobby" value="C">C
            <input type="checkbox" name="hobby" value="C++">C++<br>
    <input type="submit" value="提交">
form>
body>
	<servlet>
        <servlet-name>ParameterServletservlet-name>
        <servlet-class>com.szx.demo02.ParameterServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>ParameterServletservlet-name>
        <url-pattern>/parameterurl-pattern>
    servlet-mapping>
方式二
public class ParameterServlet extends HttpServlet {
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        //获取请求参数名和对应值
        Map<String, String[]> parameterMap = request.getParameterMap();
        //将map集合中所有键值对组成Set集合
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        //遍历Set集合
        for (Map.Entry<String, String[]> me : entries){
     
            System.out.print(me.getKey() + "对应的数值有:");
            for (String ts : me.getValue()){
     
                System.out.print(ts + "   ");
            }
            System.out.println();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        this.doPost(request,response);
    }
}

获取其他信息

HttpServletRequest接口

javax.servlet.http.HttpServletRequest接口是ServletRequest接口的子接口,主要用于提供HTTP请求信息的功能。
不同于表单数据,在发送HTTP请求时,HTTP请求头直接由浏览器设置。
可直接通过HttpServletRequest对象提供的一系列get方法获取请求头数据。

String getRequestURI() 返回此请求的资源路径信息
StringBuffer getRequestURL() 返回此请求的完整路径信息
String getMethod() 返回发出此请求的HTTP方法的名称,例如GET、POST
String getQueryString() 返回路径后面请求中附带的参数
String getServletPath() 返回此请求中调用servlet的路径部分

		//获取客户端其他信息
        System.out.println("发送请求的客户端IP为:" + request.getRemoteAddr());
        System.out.println("发送请求的客户端端口号为:" + request.getRemotePort());
        System.out.println("发送请求的路径为:" + request.getRequestURI());
        System.out.println("发送请求的完整路径为:" + request.getRequestURL());
        System.out.println("发送请求的方式为:" + request.getMethod());
        System.out.println("发送请求的附带参数为:" + request.getQueryString());
        System.out.println("发送请求的Servlet路径为:" + request.getServletPath());

相应信息的设置和发送

ServletResponse接口

javax.servlet.ServletResponse接口用于定义一个对象来帮助Servlet向客户端发送响应。
Servlet容器创建ServletResponse对象,并将其作为参数传递给servlet的service方法。

PrintWriter getWriter() 返回可向客户端发送字符文本的PrintWriter对象
String getCharacterEncoding() 获取响应内容的编码方式
void setContentType(String type) 如果尚未提交响应,则设置发送到客户端响应的内容类型。内容类型可以包括字符编码规范,例如text/html;charset=UTF-8

		//向浏览器发出响应
        //获取相应数据默认编码
        String characterEncoding = response.getCharacterEncoding();
        System.out.println("默认相应编码为:" + characterEncoding);
        //更改相应编码
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.write("I Received!");
        writer.write("接收到了!");
        System.out.println("服务器发送成功!");
        writer.close();
HttpServletResponse接口

javax.servlet.http.HttpServletResponse接口继承ServletResponse接口,以便在发送响应时提供特定于HTTP的功能。

void sendRedirect(String location) 使用指定的重定向位置URL向客户端发送临时重定向响应


Servlet接收中文乱码

接收乱码原因

浏览器在提交表单时,会对中文参数值进行自动编码。当Tomcat服务器接收到浏览器请求后自动解码,当编码与解码方式不一致时,就会导致乱码。

解决POST接收乱码
接收之前设置编码方式:
 request.setCharacterEncoding(“utf-8)
提示:
 必须在调用request.getParameter(“name”)之前设置
解决GET接收乱码
 将接收到的中文乱码重新编码:
 // 接收到get请求的中文字符串
 String name = request.getParameter("name");
 // 将中文字符重新编码,默认编码为ISO-8859-1
 String userName = new String(name.getBytes(“ISO-8859-1),“utf-8");

ServletConfig接口

javax.servlet.ServletConfig接口用于描述Servlet本身的相关配置信息,在初始化期间用于将信息传递给Servlet配置对象。

String getServletName() 返回Servlet的别名
String getInitParameter(String name) 返回包含初始化参数值的字符串,如果该参数不存在,则返回null
Enumeration getInitParameterNames() 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举
ServletContext getServletContext() 返回对调用方正在其中执行的ServletContext的引用

	
    <servlet>
        <servlet-name>ConfigServletservlet-name>
        <servlet-class>com.szx.demo02.ConfigServletservlet-class>
        
        <init-param>
            
            <param-name>usernameparam-name>
            
            <param-value>adminparam-value>
        init-param>
        <init-param>
            <param-name>passwordparam-name>
            <param-value>123456param-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>ConfigServletservlet-name>
        <url-pattern>/configurl-pattern>
    servlet-mapping>
public class ConfigServlet implements Servlet {
     
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
     
        System.out.println("初始化操作。。。");
        System.out.println("Servlet别名是:" + servletConfig.getServletName());
        System.out.println("初始化username的值:" + servletConfig.getInitParameter("username"));
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
     
            System.out.println("初始化参数名为:" + initParameterNames.nextElement());
        }
        //获取servletcontext接口的引用
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("获取到的servletContext引用为:" + servletContext);
    }

    @Override
    public ServletConfig getServletConfig() {
     
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
     

    }

    @Override
    public String getServletInfo() {
     
        return null;
    }

    @Override
    public void destroy() {
     

    }
}

ServletContext接口

javax.servlet.ServletContext接口主要用于定义一组方法,Servlet使用这些方法与它的Servlet容器通信。
服务器容器在启动时会为每个项目创建唯一的一个ServletContext对象,用于实现多个Servlet之间的信息共享和通信。
在Servlet中通过this.getServletContext()方法可以获得ServletContext对象。

String getInitParameter(String name) 返回包含初始化参数值的字符串,如果该参数不存在,则返回null
Enumeration getInitParameterNames() 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举
String getRealPath(String path) 返回包含给定虚拟路径的实际路径的字符串
String getContextPath() 返回与此上下文关联的主路径
InputStream getResourceAsStream(String path) 将位于指定路径的资源作为InputStream对象返回
void setAttribute(String name, Object object) 将指定的属性名和属性值绑定到当前对象
Object getAttribute(String name) 根据执行的属性名获取属性值
void removeAttribute(String name) 删除指定的属性名信息

	
    <context-param>
        <param-name>param1param-name>
        <param-value>value1param-value>
    context-param>
    <context-param>
        <param-name>param2param-name>
        <param-value>value2param-value>
    context-param>
    <servlet>
        <servlet-name>ContextServletservlet-name>
        <servlet-class>com.szx.demo02.ContextServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>ContextServletservlet-name>
        <url-pattern>/contexturl-pattern>
    servlet-mapping>
public class ContextServlet extends HttpServlet {
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        //配置参数的获取
        ServletContext servletContext = getServletConfig().getServletContext();
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
     
            String string = initParameterNames.nextElement();
            System.out.println(string + "对应的值为:" + servletContext.getInitParameter(string));
        }
        //相关路径的获取
        String contextPath = servletContext.getContextPath();
        System.out.println("获取上下文关联的路径信息为:" + contextPath);
        //   / 在服务器被解析为:http://ip地址:端口号/工程名  获取实际路径信息
        String realPath = servletContext.getRealPath("/");
        System.out.println("获取的实际路径信息为:" + realPath);
        //设置和获取属性信息
        servletContext.setAttribute("key","value");
        Object key = servletContext.getAttribute("key");
        System.out.println("根据参数指定属性名获取的属性值为:" + key);
        servletContext.removeAttribute("key");
        Object key1 = servletContext.getAttribute("key");
        System.out.println("根据参数指定属性名获取的属性值为:" + key1);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        this.doPost(request,response);
    }
}

你可能感兴趣的:(tomcat,java,servlet,后端)