WebServlet 4.0

举报
tea_year 发表于 2021/12/23 01:43:59 2021/12/23
【摘要】 目录结构   package com.aaa.servlet; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import ja...

目录结构

 


  
  1. package com.aaa.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. /**
  9. * Created by 张晨光 on 2020/3/20 16:01
  10. *注解,来实现get请求 post请求的输出...
  11. */
  12. @WebServlet("/login")
  13. public class HelloServet extends HttpServlet {
  14. //上次课的时候,重写的是service方法
  15. //重写doGet()/doPost()方法
  16. @Override
  17. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  18. // super.doGet(req, resp);
  19. //哪个地方传过来的,是地址栏url传过来的,get请求...
  20. System.out.println("get请求");
  21. }
  22. @Override
  23. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  24. // super.doPost(req, resp);
  25. System.out.println("post请求...");
  26. }
  27. }

1.属性列表:

属性名 类型 描述
name String servlet-name,如果没有显示指定,该Servlet的取值为全限定名
value String[] 等价于 urlPatterns 属性,与该属性不能同时使用
urlPatterns String[] 指定Servlet url的匹配模式,等价于<url-parttern>
loadOnStartup int 指定Servlet的加载顺序
initParams webInitParam[] 指定初始化参数
asyncSupported boolean 是否支持异步操作
description String 描述
displayName String servlet显示名
     

 

 

 

 

 

 

 

 

 

二属性说明

1.initParams:

      initParams={@WebInitParam(paramName="zsms",paramValue="醉生梦死")//在服务器初始化的时候会打印,因为调用Init方法}


  
  1. package com.kenny.servlet;
  2. import javax.servlet.ServletConfig;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebInitParam;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. /**
  11. * asyncSupported = true 是否支持异步请求
  12. */
  13. @WebServlet(value = "/hello",asyncSupported = true,initParams = {
  14. @WebInitParam(name="name",value = "Kenny"),
  15. @WebInitParam(name="age",value = "20")
  16. }
  17. )
  18. public class HelloServlet extends HttpServlet {
  19. String name;
  20. String age;
  21. @Override
  22. public void init(ServletConfig config) throws ServletException {
  23. name = config.getInitParameter("name");
  24. age = config.getInitParameter("age");
  25. System.out.println("init--------- name: "+ name +" ,---------- age: "+age);
  26. super.init(config);
  27. }
  28. @Override
  29. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  30. System.out.println("doGet--------- name: "+ name +" ,---------- age: "+age);
  31. resp.getWriter().write("hello,thank you "+ name+" ,and you age is "+ age);
  32. }
  33. }
  34. servlet initParams 事例

2.urlPatterns/value(不可以同时使用):

      Servlet 2.5开始,一个servlet可以使用多个url-pattern规则,因此 urlPatterns 属性也支持数组配置;web.xml 配置下,是采用 servlet-mapping 和当servlet容器接收到浏览器发起的一个url请求后,容器会用url减去当前应用的上下文路径,以剩余的字符串作为servlet映射,假如url是http://localhost:8080/ServletTest/index.do,其应用上下文(context)是ServletTest。http://localhost:8080/ServletTest去掉,用剩下的/index.do部分拿来做servlet的映射匹配;url-pattern映射匹配过程是有优先顺序的(精确匹配>路径匹配>扩展名匹配>缺省匹配)而且当有一个servlet匹配成功以后,就不会去访问剩下的servlet了。

     可以使用数组方式:urlPatterns={"/servlet/url1","/servlet/url2"}

3.asyncSupported

模拟代码,可以打开多个浏览器查看


  
  1. //Servlet
  2. package com.kenny.servlet;
  3. import javax.servlet.AsyncContext;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. import java.io.PrintWriter;
  11. import java.util.Date;
  12. @WebServlet(urlPatterns = "/async",asyncSupported = true)
  13. public class AsyncServlet extends HttpServlet {
  14. @Override
  15. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  16. throws IOException, ServletException {
  17. resp.setContentType("text/html;charset=UTF-8");
  18. PrintWriter out = resp.getWriter();
  19. out.println("进入Servlet的时间:" + new Date() + ".");
  20. out.flush();
  21. //在子线程中执行业务调用,并由其负责输出响应,主线程退出
  22. AsyncContext ctx = req.startAsync();
  23. new Thread(new Executor(ctx)).start();
  24. out.println("结束Servlet的时间:" + new Date() + ".");
  25. out.flush();
  26. }
  27. }
  28. //模拟多线程
  29. package com.kenny.servlet;
  30. import javax.servlet.AsyncContext;
  31. import java.io.PrintWriter;
  32. import java.util.Date;
  33. public class Executor implements Runnable {
  34. private AsyncContext ctx = null;
  35. public Executor(AsyncContext ctx){
  36. this.ctx = ctx;
  37. }
  38. public void run(){
  39. try {
  40. //等待十秒钟,以模拟业务方法的执行
  41. Thread.sleep(10000);
  42. PrintWriter out = ctx.getResponse().getWriter();
  43. out.println(Thread.currentThread().getId()+"----业务处理完毕的时间:" + new Date() + ".");
  44. out.flush();
  45. ctx.complete();
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. 支持多线程

 

 

注解源码:


  
  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface WebServlet {
  5. String name() default "";
  6. String[] value() default {};
  7. String[] urlPatterns() default {};
  8. int loadOnStartup() default -1;
  9. WebInitParam[] initParams() default {};
  10. boolean asyncSupported() default false;
  11. String smallIcon() default "";
  12. String largeIcon() default "";
  13. String description() default "";
  14. String displayName() default "";
  15. }
  16. WebServlet 代码

@WebServlet注解用于标注在一个继承了HttpServlet类之上,属于类级别的注解。

用法形如:

@WebServlet("/DisplayHeader1")


// 扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {


// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 

其中 /DisplayHeader1 表示访问该servlet的 url 映射(地址)(此处为相对路径,即 “项目名称/DisplayHeader1” )。

 

该注解的作用等价于 在web.xml中配置的该servlet的<servlet-mapping>元素中<url-pattern>的配置,比如:

<servlet>
<!-- 类名 -->
<servlet-name>DisplayHeader</servlet-name>
<!-- 所在的包 -->
<servlet-class>test.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/DisplayHeader2</url-pattern>
</servlet-mapping>

此时,访问如下两个路径的效果是一样的,不互斥:

http://localhost:8080/test/DisplayHeader1

http://localhost:8080/test/DisplayHeader2

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/105004521

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。