文章目录
上结果
为什么我们要自定义一个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,在参数上加就行了
简直就是我以前白学了