JavaEE学习——servlet进阶

错误返回如何修改

404:

        1.检查请求的路径,和服务器这边的配置是否一致

        2.确认webapp是否被正确加载,smart tomcat由于只是加载你这一个webapp如果失败就会启动失败,拷贝war的方式,tomcat要加载多个webapp,如果加载失败了,只会有日志。

405

        1.写的doXX方法,和请求发起的方法,不匹配。比如浏览器发的GET,服务器写的doPost。

        2.发的是GET请求,服务器也写的是doPost,但没有把super.doGet删除。

        父类的doGet有什么

        先获取protocol(版本号),然后判断返回。

500

        服务器内部错误,代码中抛出异常。一定要观察异常调用栈

空白页面

        没有执行getWriter。writer方法

无法访问此网站

        要么是服务器没有正确运行,要么IP或者端口号不对

ServletAPI

api很多,但只用学习三个类

1.HttpServlet

        是为了处理不同的请求,通过继承这个类,并重写其中的方法,让Tomcat去调用这里面的逻辑

1.init 

        在webapp加载的时候执行init();

2.destory

         在webapp结束的时候执行;Tomcat销毁的时候执行

        如何结束Tomcat

1.通过8005端口,给Tomcat发起特殊的请求,tomcat就关闭了,执行这个方法。

2.直接杀死tomcat进程。

3.service

        每次收到请求都会执行,一般并不直接使用,往往使用下面的方法来替代这个方法。

什么叫生命周期?

        就算什么阶段做什么事情。

谈谈Servlet的生命周期。

        1.webapp刚被加载的时候,调用init方法

        2.每次收到请求的时候,调用service方法

        3.webapp要结束的时候,调用destroy方法

4.doGet

        每次收到GET请求时执行

5.doPost

        每次收到POST请求时执行

6.doPut、doDelete,doOptions

        每次收到XX方法时执行

2.HttpServletRequest

 Tomcat收到的HTTP请求,就会被解析成上述对象。

String getProtocol() 返回请求协议的名称和版本。

String getMethod() 返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。 String getRequestURI() 从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该 请求的 URL 的一部分。URL可以理解成URI的一种实现方式

String getContextPath() 返回指示请求上下文的请求 URI 部分。

String getQueryString() 返回包含在路径后的请求 URL 中的查询字符串。就算?后面的。

Enumeration getParameterNames() 返回一个 String 对象的枚举,包含在该请求中包含的参数的名 称。 拿到所有的key

String getParameter(String name) 以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。可以获得query string中的键值对,根据key拿到所有的value

String[] getParameterValues(String name) 返回一个字符串对象的数组,包含所有给定的请求参数的值, 如果参数不存在则返回 null。针对一个key涉及多个value,不太涉及到

Enumeration getHeaderNames() 返回一个枚举,包含在该请求中包含的所有的头名。获取到请求头里面的键值对,的到一个key

String getHeader(String name) 以字符串形式返回指定的请求头的值。可以从上面拿到请求头里面键值对的value

String getCharacterEncoding() 返回请求主体中使用的字符编码的名称。

String getContentType() 返回请求主体的 MIME 类型,如果不知道类型则返回 null。获取body的类型。

int getContentLength() 以字节为单位返回请求主体的长度,并提供输入流,或者如果 长度未知则返回 -1。获取body的长度。

InputStream getInputStream() 用于读取请求的 body 内容. 返回一个 InputStream 对象.获取body的内容

第一种获取querystring

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuffer sb = new StringBuffer();
        Enumeration<String> key=req.getParameterNames();
        while(key.hasMoreElements()){
            String k= key.nextElement();
            String v=req.getParameter(k);
            sb.append("key="+k+"value="+v+"\n");
        }
        resp.getWriter().write(sb.toString());
    }

2.第2中获取body为键值对格式

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuffer sb = new StringBuffer();
        Enumeration<String> key=req.getParameterNames();
        while(key.hasMoreElements()){
            String k= key.nextElement();
            String v=req.getParameter(k);
            sb.append("key="+k+"value="+v+"\n");
        }
        resp.getWriter().write(sb.toString());
    }

3。第三种获取json格式的body

要先添加json依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

如何使用?

ObjectMapper对象映射器:把一个对象映射到json字符串,或者把一个json字符串,映射到对象。

@WebServlet("/json")
public class jsonServlet extends HttpServlet {
    //约定客户端的body格式为json
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        user user1= objectMapper.readValue(req.getInputStream(), user.class);
        System.out.println(user1.uname+"**"+user1.pword);
        resp.getWriter().write(user1.uname+"**"+user1.pword);
    }
}
class user{
    public String uname;
    public String pword;
}

jackson的readValue工作过程,先把json字符串解析成键值对,先放到Map中,再根据参数填入的类对象,通过反射api就可以知道,这个类里面有那些属性,每个属性的名字和类型。一次把这里的每个属性都取出来,通过属性名字查询上述的Map,把的到的值赋给这个类的属性。

所以必须要先知道json的结构是什么。也就是约定前后端结构。

3.HttpServletResponse

表示响应

void setStatus(int sc) 为该响应设置状态码。

void setHeader(String name, String value) 设置一个带有给定的名称和值的 header. 如果 name 已经存在, 则覆盖旧的值.覆盖效果。

void addHeader(String name, String value) 添加一个带有给定的名称和值的 header. 如果 name 已经存在, 不覆盖旧的值, 并列添加新的键值对

void setContentType(String type) 设置被发送到客户端的响应的内容类型。

void setCharacterEncoding(String charset) 设置被发送到客户端的响应的字符编码(MIME 字符集)例 如,UTF-8。

void sendRedirect(String location) 使用指定的重定向位置 URL 发送临时重定向响应到客户端。

PrintWriter getWriter() 用于往 body 中写入文本格式数据.

OutputStream getOutputStream() 用于往 body 中写入二进制格式数据

设置状态码

@WebServlet("/status")
public class StatusS extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
    }
}

刷新

@WebServlet("/refresh")
public class RefershS extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("refresh","2");
        long toDayTime=System.currentTimeMillis();
        Date tDT=new Date(toDayTime);
        SimpleDateFormat date=new SimpleDateFormat();
        String dateTime=date.format(tDT);
        System.out.println();
        resp.getWriter().write("time"+ dateTime);
    }
}

重定向

@WebServlet("/Redit")
public class RedirectServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("Location","https://www.bilibili.com/");
    }
}

由于idea可能和浏览器的编码方式不一致,会导致乱码问题,所以要设置响应的编码方式,最好统一为utf-8;

resp.setContentType("text/html; charset=utf-8");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值