Java基础 -> 分析自定义servlet,注册servlet,加载页面(基于boot)

上结果

在这里插入图片描述
在这里插入图片描述

为什么我们要自定义一个servlet

我们要对客户端传过来的数据,先进行一个简单的处理加工()

1.写一个servlet,一定要继承,是的,继承不是实现接口,HttpServlet 类,这也是servlet接口的实现类

干净的没有注释的:

public class HelloServletConfig extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req,
                       HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello World!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hello World!</h1>");
    out.println("</body>");
    out.println("</html>");
  }

  @Override
  protected void doPost(HttpServletRequest req,
                        HttpServletResponse resp) throws ServletException, IOException {
    super.doPost(req, resp);
  }
}

有注释的:

public class HelloServletConfig extends HttpServlet {
  //重写此方法时,读取请求数据,写入响应头,
  // 获取响应的writer或output stream对象,最后写入响应数据。
  // 最好包括内容类型和编码。
  // 使用PrintWriter对象返回响应时,请在访问PrintWriter对象之前设置内容类型。
  @Override
  protected void doGet(HttpServletRequest req,
                       HttpServletResponse response) throws ServletException, IOException {
    //设置内容类型:setContentType 如果尚未提交响应,则设置发送到客户端的响应的内容类型。
    // 给定的内容类型可以包括字符编码规范,例如text/html;charset=UTF-8。  (text/html扩展就是一个text的html文本吧,应该吧)
    // 如果在调用getWriter之前调用了此方法,则仅从给定的内容类型设置响应的字符编码。 
    // 可以重复调用此方法来更改内容类型和字符编码。
    // 如果在提交响应后调用此方法,则此方法无效。
    // 如果在调用getWriter或提交响应后调用响应,则不会设置响应的字符编码。

    //结论:setContentType东西可以在getWriter之前调用设置编码如utf8,之后调用这个方法会无效
    response.setContentType("text/html");
    //获取写入程序:getWriter 返回一个printwitter对象,
    // 该对象可以向客户端发送字符文本。
    // PrintWriter使用getCharacterEncoding返回的字符编码。
    // 如果响应的字符编码未按getCharacterEncoding(即,方法刚刚返回默认值ISO-8859-1)中的说明指定,
    // 则getWriter将其更新为ISO-8859-1。 (这里我们只是设置了text/html,等会编码一定是这个)
    // 在PrintWriter上调用flush()将提交响应。 
    // 可以调用此方法或getOutputStream来编写主体,而不是同时写入主体。

    //结论:就是可以调用getWriter方法向客户端发送字符文本,其他的以后遇到了再了解
    PrintWriter out = response.getWriter();
    //下面猜就是要发送的内容了,结合text/html这个东西,应该是会把这些个字符串当做text文本,写到一个html中
    //然后就是一个模拟的html页面了
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello World!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hello World!</h1>");
    out.println("</body>");
    out.println("</html>");
  }

  @Override
  protected void doPost(HttpServletRequest req,
                        HttpServletResponse resp) throws ServletException, IOException {
    super.doPost(req, resp);
  }
}

2.原来是在web.xml注册servlet,现在springboot没有了

1.写一个configuration类,在类中去注册我们写的servlet的bean
干净的:

@Configuration
public class MyConfiguration {
  @Bean
  public ServletRegistrationBean servletRegistrationBean() {
    ServletRegistrationBean<HelloServletConfig> bean = new ServletRegistrationBean<>(new HelloServletConfig());
    bean.addUrlMappings("/hello");
    return bean;
  }
}

注释的:

@Configuration
public class MyConfiguration {
  //注册servlet必需要用ServletRegistrationBean,不是自己的类
  @Bean
  public ServletRegistrationBean servletRegistrationBean() {
    //为什么要new这个类去注册我们自己写的servlet,我们点进去看看,源码,贴在这个代码下面
    //看完源码,就懂了,就是要用这个类来指定servlet的路径的,不用这个就找不到我们写的servlet
    ServletRegistrationBean<HelloServletConfig> bean = new ServletRegistrationBean<>(new HelloServletConfig());
    //addUrlMappings,刚刚在源码中看了,默认是/*,我们可以用add来改,我们改一下
    bean.addUrlMappings("/hello");
    return bean;
  }
}
public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
	//有个 DEFAULT_MAPPINGS:默认映射,也就是我如果不写路径他应该也会默认在/下面使用这个serlvet
	private static final String[] DEFAULT_MAPPINGS = { "/*" };
	//其他的都是些没什么用的属性,我们在看看有哪些可以用的方法,去瞄一眼,看下面
	private T servlet;

	private Set<String> urlMappings = new LinkedHashSet<>();

	private boolean alwaysMapUrl = true;

	private int loadOnStartup = -1;

	private MultipartConfigElement multipartConfig;

在这里插入图片描述

添加Url映射:addUrlMappings()   就直接说了,我们要是想自己定义url路径就调用这个方法

//看看上面的如,方法最左边,是不是有把锁,源码我没贴了啊,锁钥匙就是说是public的,和不是public的
//也就是这3个方法,只有addUrlMappings是public的可以用,其他两个都是不能随便在外边使用的,我们现在就点不出来
添加注册:addRegistration  我们这边没用,就不看什么源码了,看名字就懂一点点了
配置:configure 配置注册设置。如果需要,子类可以重写此方法来执行附加配置(这是注释不是我说的)

3.清晰的,没有注释的代码

1.servlet

public class HelloServletConfig extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req,
                       HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello World!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hello World!</h1>");
    out.println("</body>");
    out.println("</html>");
  }

  @Override
  protected void doPost(HttpServletRequest req,
                        HttpServletResponse resp) throws ServletException, IOException {
    super.doPost(req, resp);
  }
}

2.configuration

@Configuration
public class MyConfiguration {
  @Bean
  public ServletRegistrationBean servletRegistrationBean() {
    ServletRegistrationBean<HelloServletConfig> bean = new ServletRegistrationBean<>(new HelloServletConfig());
    bean.addUrlMappings("/hello");
    return bean;
  }
}

在这里插入图片描述

4.纯springboot实现servlet功能,springboot确实简单的不像话,跟个鬼一样

1.刚刚上面使用servlet,要重写方法,继承httpservlet
2.又要配置bean,添加路径,有web.xml还要配mapper
现在

  @RequestMapping("/get")
  public void test1(HttpServletRequest request,
                    HttpServletResponse response) throws IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello World!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hello World!</h1>");
    out.println("</body>");
    out.println("</html>");
  }

对,你没看错,
@RequestMapping("/get"):表示就是路径
需要用request,response,在参数上加就行了
简直就是我以前白学了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值