Servlet

来源:互联网 发布:mac book pro 2015 编辑:程序博客网 时间:2024/06/05 18:43

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例子第一个例子:@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    // response.sendError(404, "nothing!!");    response.setStatus(404);}运行结果:可以看到浏览器显示:404错误,找不到网页第2个例子 //设置重定向(302, Location) @Overrideprotected 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个例子字符响应流@Overrideprotected 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.lwxe-mail->1203631049@qq.com第6部分ServletContextServletConfig中提供了获取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 lwxemail 1203631049@qq.com获取资源可以使用ServletContext来获取Web应用下的资源路径/资源流等内容: