一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

 一、入门

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/*
一、javaweb动态资源目录结构
    * WEB-INF
        - classes:存放字节码文件
        - lib:存放jar包
        - web.xml:web项目核心配置文件
二、访问动态资源的步骤
    1、资源地址:http://localhost:8080/A01javaweb_war_exploded/first
        * http://localhost:8080:找到服务器
        * /A01javaweb_war_exploded(虚拟目录):找到项目
        * /first(资源名称):找到资源
    2、web.xml:映射关系
        <servlet>
            <servlet-name>first</servlet-name>
            <servlet-class>FirstServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>first</servlet-name>
            <url-pattern>/first</url-pattern>
        </servlet-mapping>
    3、Servlet:实现接口,由tomcat创建对象并调用service方法
        * HttpServlet:对Servlet接口的进一步封装
*/
@WebServlet("/first")//servlet3.0后可使用注解配置,不需要web.xml。使用方式:@WebServlet("/资源名称")
public class FirstServlet implements Servlet {
    /*
    1、默认第一次访问执行init方法
    2、可由web.xml配置执行init方法的时机
        <servlet>
            <load-on-startup>0或正数:tomcat启动时执行;负数:第一次访问时执行</load-on-startup>
        </servlet>
    */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("执行first init方法");
    }

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

    /*
    每次访问都执行service方法
    */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行first方法(注解方式)");
    }

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

    /*
    正常关闭tomcat执行destroy方法
    */
    @Override
    public void destroy() {
        System.out.println("执行first second方法");
    }
}

 

 二、request和response

@WebServlet("/second")
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
/*
一、请求消息
    1、请求行
        POST /wuxi HTTP/1.1
    2、请求头
        User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
        Referer:告诉服务器,我(当前请求)从哪里来?
    3、请求空行
    4、请求体
        封装POST请求消息的请求参数
二、request功能
    1、获取请求消息数据
        1、获取请求行数据:
            String getMethod():获取请求方式(GET)
            String getContextPath():获取虚拟目录(/A01javaweb_war_exploded)
            String getServletPath():获取servlet路径(/second)
            String getQueryString():获取get方式请求参数(name=mengmeiqi&age=18)
            String getRequestURI():获取请求URI(/A01javaweb_war_exploded/second)
            StringBuffer getRequestURL():获取请求URL(http://localhost:8080/A01javaweb_war_exploded/second)
            String getProtocol():获取协议及版本(HTTP/1.1)
            String getRemoteAddr():获取客户机的IP地址(0:0:0:0:0:0:0:1)
        2、获取请求头数据
            String getHeader(String):根据请求头key获取value
            Enumeration<String> getHeaderNames():获取请求头的所有key
                使用方式:
                    Enumeration<String> headerNames = req.getHeaderNames();
                    while (headerNames.hasMoreElements()) {
                        String key = headerNames.nextElement();
                        String value = req.getHeader(key);
                        System.out.println(key + ":" + value);
                    }
        3、获取请求体数据
            BufferedReader getReader():获取字符输入流
                使用方式:
                    BufferedReader reader = req.getReader();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        System.out.println(line);
                    }
            ServletInputStream getInputStream():获取字节输入流
    2、其他功能
        1、获取请求参数通用方式
            String getParameter(String):根据参数key获取value
            String[] getParameterValues(String):根据参数key获取数组value
            Enumeration<String> getParameterNames():获取参数的所有key
            Map<String, String[]> getParameterMap():获取参数的map结果集
            void setCharacterEncoding("utf-8"):解决中文乱码问题
        2、请求转发
            RequestDispatcher getRequestDispatcher(String):获取请求分发器,参数为资源名称
            void forward(ServletRequest, ServletResponse):将请求转发
        3、共享数据
            request域(请求转发中使用):
                void setAttribute(String, Object):以键值对方式存储数据
                Object getAttribute(String):根据键获取所存储的数据
                void removeAttribute(String):根据键删除所存储的数据
        4、获取ServletContext
            ServletContext getServletContext()
三、BeanUtils工具类
    javabean:类必须被public修饰,必须提供空参构造方法,成员变量必需被private修饰,提供公共的getter和setter方法
    导包:commons-beanutils、commons-logging
    方法:
        void setProperty(Object, String, Object):设置javabean的属性值
        String getProperty(Object, String):获取javabean的属性值
        void populate(Object, Map<String, ? extends Object>):将map结果集转换成javabean
            使用方式:
                try {
                    req.setCharacterEncoding("utf-8");
                    User loginuser = new User();
                    Map<String, String[]> parameterMap = req.getParameterMap();
                    BeanUtils.populate(loginuser, parameterMap);
                    System.out.println(loginuser);
                } catch (Exception e) {
                    e.printStackTrace();
                }
四、响应消息
    1、响应行
        HTTP/1.1 200 OK
        状态码:
            1、1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx状态码
            2、2xx:成功。代表:200
            3、3xx:重定向:代表:302(重定向)、304(访问缓存)
            4、4xx:客户端错误。代表:404(请求路径没有对应的资源)、405(请求方式没有对应的doXxx方法)
            5、5xx:服务器端错误。代表:500(服务器内部出现异常)
    2、响应头
        Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
        Content-disposition:服务器告诉客户端以什么格式打开响应体数据
            in-line:默认值,在当前页面内打开
            attachment;filename=xxx:以附件形式打开响应体。文件下载
    3、响应空行
    4、响应体:传输的数据
五、response功能
    1、设置响应消息数据
        void setStatus(int):设置响应状态码
        void setHeader(String,String):设置响应头
        void setContentType(String):告诉浏览器响应体的字符编码(在获取流之前使用)
            原理:
                响应对象.setCharacterEncoding("utf-8");
                响应对象.setHeader("content-type", "text/html;charset=utf-8");
        PrintWriter getWriter():获取字符输出流
            用法:
                响应对象.getWriter().write("字符串");
        ServletOutputStream getOutputStream():获取字节输出流
            用法:
                响应对象.getOutputStream().write("字符串".getBytes("utf-8"));
    2、重定向
        void sendRedirect(String):参数为虚拟目录+资源名称
            原理:
                响应对象.setStatus(302);
                响应对象.setHeader("location", 虚拟目录+资源名称);
六、ServletContext对象
    1、概念:代表整个web应用,可以和程序的容器(服务器)来通信
    2、获取:
        1、通过请求对象获取:请求对象.getServletContext();
        2、通过HttpServlet获取:this.getServletContext();
    3、功能:
        1、获取MIME类型:
            MIME类型:在互联网通信过程中定义的一种文件数据类型(text/html、image/jpeg、application/json)
            方法:String getMimeType(String)
        2、共享数据:(所占内存在web应用生命周期内不会销毁,所以不推荐使用)
            void setAttribute(String,Object):存储数据
            Object getAttribute(String):获取数据
            void removeAttribute(String):删除数据
        3、获取文件的真实(服务器)路径:
            方法:String getRealPath(String):/路径为当前项目部署在服务器上的绝对路径
*/
    }
}

 

三、jackson

  1、导包

jackson-annotations、jackson-core、jackson-databind

  2、代码

public class User {
    public static void main(String[] args) throws JsonProcessingException {
/*
一、java转json
    方法:
        1、void writeValue(File, Object):将对象转成json,并写入到文件
        2、void writeValue(Writer, Object):将对象转成json,并使之成为字符流
        3、void writeValue(OutputStream, Object):将对象转成json,并使之成为字节流
        4、String writeValueAsString(Object):将对象转成json字符串
    注解:
        1、@JsonIgnore:忽略该属性
        2、@JsonFormat(pattern = "yyyy-MM-dd"):格式化该属性
二、json转java
    方法:
        T readValue(String, Class<T>):将json转成对象
*/
        User user = new User(1, "mengmeiqi", "123456", new Date());
        ObjectMapper mapper = new ObjectMapper();
        String userjson = mapper.writeValueAsString(user);
        System.out.println(userjson);
        User userobj = mapper.readValue(userjson, User.class);
        System.out.println(userobj);
    }

    private Integer id;
    private String username;
    private String password;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    public User() {
    }

    public User(Integer id, String username, String password, Date birthday) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

 

posted on 2020-08-28 15:50  一路繁花似锦绣前程  阅读(419)  评论(0编辑  收藏  举报