Servlet
  ZT8lPCn7HRRr 2023年11月09日 35 0

Servlet

课程目标

	1、如何去书写一个servlet
	2、如何去访问一个servlet
	3、如何去快速创建一个servlet
	4、web中一些路径的访问分析
	5、servlet一些配置项(servletConfig)
	6、web项目的配置项(servletContext)

servlet简介

Servlet 是sun公司提供的一门用于开发动态web资源的技术 Servlet 是基于Request Response编程模型 Sun公司在其API提供了一个servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤: 1、编写一个java类,实现servlet接口 2、把开发好的程序布署到服务器中

img

servlet:1、接受浏览器发送过来的消息。
	    2、给浏览器返回消息。浏览器认识html。可以动态去输出html

Request:请求。客户端向服务端发送的信息。
Response:响应。服务器向客户端发送的信息。
通常请求和响应是成对出现的。


作用:servlet 编写一个程序生成网页。
浏览器请求servlet,servlet会生产html。把html传送给浏览器(响应)。浏览器看到内容是html

servlet快速入门

实现步骤

写servlet做两件事
1、创建一个类来实现servlet接口。 由sun公司定义的一个接口。(定义一个规范)
2、把项目部署到web服务器中(tomcat)。

sun公司定义一个servlet的规范。定义了servlet应该有哪些方法,以及方法需要的参数。
1、实现servlet接口(javax.servlet.Servlet)

2、重写service方法
	当浏览器输入地址,访问servlet的时候,servlet会执行servcie方法。
3、在Web/WEB-INF/web.xml中配置servlet的路径 。浏览器访问servlet的路径
	web.xml

代码实现

实现servlet 接口

/**
 * @Auther: yanqi
 * @Desc 写一个普通的类,实现servlet接口即可
 */
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我是初始化init方法");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws 	ServletException, IOException {
        System.out.println("我是service方法,每一次请求都会响应");
	   //获取用户提交过来的数据
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String username = request.getParameter("username");
        System.out.println(username);

        //响应给浏览器
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        response.getWriter().println("你刚刚输入的是:"+username);
    }

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

    @Override
    public void destroy() {
        System.out.println("我是destroy方法,挂掉");

    }
}

配置请求路径

在web.xml中配置servlet的请求路径

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

访问 servlet

启动tomcat服务器,面页访问

<img src="assets/image-20211125161828880.png" alt="image-20211125161828880" style="zoom:50%;" />

请求路径的分析

image-20211126104649121

servlet的生命周期

servlet 什么时候出生,什么活动,什么销毁

1、当用户第一次访问servlet时,servlet会初始化,并且只初始化一次
2、每一次请求都会走service方法
3、当服务器正常关闭,servlet销毁

服务器启动配置

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
        
        <!--配置servlet初始化时机,此时服务器启动时,servet就会初始化-->
        <load-on-startup>1</load-on-startup>
        
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

url-pattern三种配置

1、完全路径匹配,以”/”开头 后面是具体的路径信息。
	你输入什么内容。访问的时候,就需要输入什么内容,才可以找到对应的servlet
	例如
  <url-pattern>/hello</url-pattern>

2、目录匹配,以/*结尾
   <url-pattern>/*</url-pattern>	
   http://ip:端口/abc/abx
   http://ip:端口/abc/bdsf 

3、扩展名匹配     *.扩展名     注意:  *.扩展名(正确)   /*.扩展名(错误)
	<url-pattern>*.do</url-pattern>
	<url-pattern>*.action</url-pattern>
    *.do 
	*.action

servlet入门小结

	1、创建一个类,去实现javax.servlet.Serlvet 这个接口(注意包不要导错)
	2、重写类中 service方法
	3、在web-inf/web.xml 中去配置serlvet一些信息
    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

快速创建servlet

实现步骤

借助开发工具可以快速的创建servlet

1、自己去定义的servlet 只需要继承HttpServlet 就可以实现 servlet的接口了。 2、以后处理用户的请求,都写在doGet或者doPost方法中。

/**
 * @Auther: yanqi
 * @Desc  1、servlet 3.0以后的版本是可以直接使用注解开发,简化了手动配置servlet请求路径
 *        2、@WebServlet( urlPatterns = "/ServletDemo")  等价于  我们在web.xml中配置
 */
@WebServlet(urlPatterns = "/ServletDemo")
public class ServletDemo extends HttpServlet {
    //请求为post走doPost
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }
    
 	//请求为post走doGet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get");

    }
}

什么时候走get请求? ​ ----- 当指定为get请求时,浏览器默认走的get请求

什么时候走post请求? ​ ----- 指定为post请求时才会走post请求

修改servlet路径模版

当我们每一次创建完servlet之后都需要手动修改请求的路径,@WebServlet( name= "ServletDemo")比较麻烦, 我们可以修改idea开发工具中的模版,下次再创建就不用再修改@WebServlet(urlPatterns = "/ServletDemo")

image-20211125165941335

web中的资源路径

如何去访问一个web中的资源

<img src="assets/image-20211125170539379.png" alt="image-20211125170539379" style="zoom:50%;" />

如果把hello.html放在WEB-INF下会发现无法直接访问。其实也可以访问,得通过后台访问,代码如下:

request.getRequestDispatcher("WEB-INF/hello.html").forward(request,response);

项目部署位置

我们把项目中的什么东西部署到tomcat中了?
这里是找tomcat部署的路径
C:\Users\yanqi\.IntelliJIdea2018.2\system\tomcat\Tomcat_8_5_33_12-servletDemo\conf\Catalina\localhost\ ROOT.xml


找到ROOT.xml中提示的路径即是项目部署的项目:
E:\Java\idea_workspase_20036\12-servletDemo\out\artifacts\12_servletDemo_war_exploded


我们发现部署是web下的所有资源:
    把项目部署到tomcat中,到底把项目中的什么东西部署到tomcat中?
    把所有web下的东西全部部署到tomcat了!!!!
    
请问src下java源代码在哪里了?
	放在WEB-INF\classes

请求路径

绝对路径

        <form action="http://localhost:8081/ServletDemo" method="post">
            
        </form>

相对路径

        <form action="/ServletDemo" method="post">
            
        </form>

servlet配置说明

servletConfig

servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。

serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。

代码实现

方式一

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>

        <!--给当前servlet配置一些参数-->
        <init-param>
            <param-name>username</param-name>
            <param-value>rose</param-value>
        </init-param>
        <init-param>
            <param-name>charset</param-name>
            <param-value>utf-8</param-value>
        </init-param>

        <!--配置servlet初始化时机-->
        <load-on-startup>1</load-on-startup>
    </servlet>
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet初始化");

        //获取配置参数
        String username = servletConfig.getInitParameter("username");
        System.out.println(username);

    }
} 

方式二

@WebServlet(urlPatterns = "/ServletDemo" , initParams = {@WebInitParam(name = "charset",value = "utf-8")})
public class ServletDemo 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 {
        /*
        //获取ServletConfig
        ServletConfig servletConfig = this.getServletConfig();
        //获取参数
        String username = servletConfig.getInitParameter("username");
        System.out.println(username);
        */

        //获取ServletConfig
        ServletConfig servletConfig = this.getServletConfig();
        //获取参数
        String charset = servletConfig.getInitParameter("charset");
        //设置响应字符集
        response.setContentType("text/html;charset="+charset);
        response.getWriter().println("我是小燕燕");
    }
}

servletContext

ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。

代码实现

    <!--配置全局参数,所有的servlet都可以进行访问-->
    <context-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </context-param>
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = this.getServletContext();
        //获取参数
        String charset = servletContext.getInitParameter("charset");
        //设置响应字符集
        response.setContentType("text/html;charset="+charset);
        response.getWriter().println("我是小燕燕");
    }

两者区别

ServletConfig:
	一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
     有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
     
ServletContext:
	对任何servlet,任何人在任何时间都有效,等于是全局的对象。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月09日 0

暂无评论

推荐阅读
ZT8lPCn7HRRr