Servlet

1.用IDEA创建web项目
在IDEA中直接点击 File -> New -> Project,
后面直接在左侧有个Java Enterprise
然后配置tomcat、java ee 7
下面列出的是组件,就是jar库,依赖其他的框架,
需要找到web appication ,选上。
创建完毕,然后开始学习会使用servlet教程。

创建完毕,这时候你打开项目中的External Libraries,会发现他自己就帮你把依赖的jar包导入进来了:
2个:JDK1.8 + Tomcat需要依赖的jar包

还有index.jsp 和web.xml

启动tomcat,访问localhost:8080就可以看到index.jsp页面的
内容了。

2.Servlet

代码:

第一部分:
HelloServlet

/**
 * Author:林万新 lwx
 * Date:  2017/11/11
 * Time: 16:32
 */
public class HelloServlet implements Servlet {

    //这个地方我明白了,我自己写的HelloServlet是实现了servlet接口,所以拥有它的所有资源,而ServletConfig
    //是servlet的,或者更上层的东西;!
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("执行了init()...");
        this.servletConfig = servletConfig;
        System.out.println("config : <"+ servletConfig + ">");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行了service()...");
        System.out.println("req: <" + servletRequest + ">, res: <" + servletResponse + ">");
        servletResponse.getWriter().print("<h1>HelloServlet</h1>");
    }

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

    @Override
    public void destroy() {
        System.out.println("执行了destroy()...");
    }
}
配置web.xml
 <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>test.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello.servlet.do</url-pattern>
    </servlet-mapping>

    解释:
    1. url-pattern 
<url-pattern/>用来指定Servlet的访问路径,必须以/开头.

可以在<servlet-mapping/>配置多个<url-pattern/>, 此时一个Servlet实例就绑定多个URL.
可以在<url-pattern/>中使用通配符*,可以使一个Servlet绑定一组URL, 但*不能出现在中间位置,也不能只有*通配符, 另外, 通配符只是一种模糊匹配URL的方式,如果存在更具体的<url-pattern/>,那么会优先选择精确匹配.

运行方式:
在浏览器上输入:http://localhost:8080/hello.servlet.do

结果显示:
浏览器内容:
HelloServlet

控制台内容:
执行了init()...
config : <org.apache.catalina.core.StandardWrapperFacade@76a327cd>
执行了service()...
req: <org.apache.catalina.connector.RequestFacade@33a1b77d>, res: <org.apache.catalina.connector.ResponseFacade@15393b10>

如果关闭tomcat会显示:
执行了destroy()...2部分:
HttpServlet

代码:
HelloHttpServlet实例

/**
 * Author:林万新 lwx
 * Date:  2017/11/11
 * Time: 17:24
 */
@WebServlet(name = "HelloHttpServlet", urlPatterns = "/hello_http_servlet.do")
public class HelloHttpServlet extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost() ...");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet() ...");
    }

}
运行结果显示:
 1)浏览器端 : 
 输入网址:http://localhost:8080/hello_http_servlet.do
 显示什么也没有(因为没写)
 2)控制台:
 doGet() ...
 说明执行了doget方法,来获得浏览器的请求

第3部分
HttpServletRequest例子

在第2部分的基础上加上:
  @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet() ...");
       //下面开始使用方法中的参数:HttpServletRequest
        String referer = request.getHeader("Referer");
        String userAgent = request.getHeader("User-Agent");
        composeResponse(referer,userAgent,response);
    }

    private  void composeResponse(String referer,String userAgent,HttpServletResponse response) throws IOException {
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        if (referer != null){
            writer.print("<h1>来源地址: " + referer + "</h1>");
        }
        else {
            writer.print("<h1>来自浏览器地址栏</h1>");
        }

        writer.print("<hr>");
        writer.print("<h1>来源信息: " + userAgent + "</h1>");
    }

 在浏览器中运行结果:

来自浏览器地址栏

来源信息: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.364部分
HttpServletResponse例子
第一个例子:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // response.sendError(404, "nothing!!");
    response.setStatus(404);
}
运行结果:
可以看到浏览器显示:404错误,找不到网页

第2个例子
 //设置重定向(302, Location)
 @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
    response.setHeader("Location", "http://www.baidu.com");
}    
运行结果显示:
 在浏览器输入网址后,直接跳转到百度页面

 HttpServletResponse还提供了另外一种重定向的方式, 直接使用sendRedirect()方法, 避免了以上的步骤
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.sendRedirect("http://www.baidu.com");
}

第3个例子
字符响应流
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter writer = response.getWriter();
    writer.print("<html>");
    writer.print("<h1>content</h1>");
    writer.print("</html>");
}
缓冲区 
PrintWriter的默认缓冲区大小为8K, 因此当响应数据大小<8K时, 数据存放在缓冲区, 而不会立刻发送到浏览器, 直到Servlet执行结束,因此如果希望马上发送给浏览器, 需要调用Response的flushBuffer()方法手动刷新缓冲区.5部分
ServletConfig

在容器初始化Servlet时, 会将一个ServletConfig实例传给init()方法,其封装了@WebServlet/部署描述符传递给Servlet的配置信息:

在helloservlet中使用
@Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("执行了init()...");
        this.servletConfig = servletConfig;
        //System.out.println("config : <"+ servletConfig + ">");
        //在容器初始化Servlet时, 会将一个ServletConfig实例传给init()方法,其封装了@WebServlet/部署描述符传递给Servlet的配置信息:
        Enumeration<String> names = servletConfig.getInitParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = servletConfig.getInitParameter(name);

            System.out.println(name + "->" + value);
        }
    }
web.xml下配置
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>test.HelloServlet</servlet-class>
        <init-param>
            <param-name>admin</param-name>
            <param-value>com.lwx</param-value>
        </init-param>
        <init-param>
            <param-name>e-mail</param-name>
            <param-value>1203631049@qq.com</param-value>
        </init-param>
    </servlet>

   运行结果:
   在控制台可以看到输出如下:
   执行了init()...
admin->com.lwx
e-mail->1203631049@qq.com

第6部分

ServletContext

ServletConfig中提供了获取ServletContext的方法getServletContext(), ServletContext代表Servlet应用程序,且每个应用程序仅有一个ServletContext实例,其在容器启动时创建, 在容器关闭时销毁, 因此可以利用其在多个Servlet中传递数据. 
所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:

例子
应用初始化参数

前面看到ServletConfig可以获取针对本Servlet的初始化参数,而利用ServletContext可以获取针对本应用程序的公共初始化参数:  

在web.xml下配置
   <context-param>
        <param-name>admin</param-name>
        <param-value>lwx</param-value>
    </context-param>
    <context-param>
        <param-name>email</param-name>
        <param-value>1203631049@qq.com</param-value>
    </context-param> 

在hellohttpservlet下
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("doGet() ...");

        //
        ServletContext context = getServletContext();

        String admin = context.getInitParameter("admin");
        String email = context.getInitParameter("email");
        System.out.printf("admin %s%n",admin);
        System.out.printf("email %s%n",email);
     }
运行结果显示:
在控制台输出:
doGet() ...
admin lwx
email 1203631049@qq.com

获取资源

可以使用ServletContext来获取Web应用下的资源路径/资源流等内容:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值