旅游电子商务 网站建设,自己做网站服务器可以吗,php做网站需要的软件,餐饮品牌设计服务一、httpServlet
写一个servlet代码一般都是要继承httpServlet 这个类#xff0c;然后重写里面的方法
但是它有一个特点#xff0c;根据之前写的代码#xff0c;我们发现好像没有写main方法也能正常执行。
原因是#xff1a;这个代码不是直接运行的#xff0c;而是放到…一、httpServlet
写一个servlet代码一般都是要继承httpServlet 这个类然后重写里面的方法
但是它有一个特点根据之前写的代码我们发现好像没有写main方法也能正常执行。
原因是这个代码不是直接运行的而是放到tomcat上运行的
换句话说tomcat里就有main方法
1.httpServlet的几个主要方法 init方法是初始化操作 service 收到http请求的时候调用一般会被doGet/doPost替代 destroy当不在使用httpServlet实例的时候调用来销毁实例释放资源 以上三个描述了 servlet的声明周期经典面试题就是描述一下这三个方法什么时间干什么事调用什么方法。在实际开发中很少会用到一般都是出现在面试题中 初始化执行init方法每次收到http请求调用 service方法结束前执行destroy方法释放资源 除了init方法其他方法都可以在子类中重写并且重写后不用手动调用tomcat会在何时机自动调用 destroy方法大概率事执行不到的。一个servlet 不用了说明tomcat要关闭了 tomcat关闭有两种方式 1.直接干掉tomcat 进程比如直接在任务管理器中 结束任务 或者直接点 叉关闭完全来不及调用destroy。 2.通过8005 管理端口给tomcat 发送一个“停机”指令这个时候是能执行到destroy的。 但是通常都是用第一种方式直接干掉进程来关闭servlet的。 使用HttpServlet类
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
WebServlet(/method) //指定路径
public class MethodServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(doPost);//控制台中打印resp.getWriter().write(doPost);//http的响应内容显示在浏览器上}Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(doPut);//控制台中打印resp.getWriter().write(doPut);//http的响应内容显示在浏览器上}protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(doDelete);//控制台中打印resp.getWriter().write(doDelete);//http的响应内容显示在浏览器上}
} 二、HttpServletRequest类 可以发现HttpServletRequest的方法里面都是get方法读方法没有set方法写方法 原因是当前拿到的HttpServletRequest,这里的数据是来自于客户端发来的。这些数据的内容是已经确定下来了程序员是不应该修改的。 这种框架做出了限制避免了程序员不小心把原有的请求修改坏的情况了 经常将URI 、URL混着用
URI 统一资源标识符相当于身份证号
URL统一资源定位符相当于住址
1使用HttpServletRequest类的方法
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;WebServlet(/show)
public class ShowRequestServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//调用上述api,把得到的结果构造成一个字符串统一返回给客户端StringBuilder stringBuilder new StringBuilder();//使用stringBuilder把HTTP请求中的数据记录下来stringBuilder.append(req.getProtocol());//获取HTTP协议版本stringBuilder.append(br);//html中的换行stringBuilder.append(req.getMethod());//获取HTTP请求方法get/poststringBuilder.append(br);stringBuilder.append(req.getRequestURI());//获取链接地址stringBuilder.append(br);stringBuilder.append(req.getContextPath());//获取一级地址stringBuilder.append(br);stringBuilder.append(req.getQueryString());//获取quary stringstringBuilder.append(br);//获取所有的 headerEnumerationString headernames req.getHeaderNames();while(headernames.hasMoreElements()){String key headernames.nextElement();String value req.getHeader(key);stringBuilder.append(key : value br);}//返回响应是一定要做的事情告诉浏览器当前是啥类型resp.setContentType(text/html;charsetutf8);//将stringBuild中的内容以字符串形式返回到响应中resp.getWriter().write(stringBuilder.toString());}
}如果不写query string这里的a和b那么这里就是a1b2这里就是null 2获取Patameter(query string) query string是url中 ?a1b2 这种格式是以键值对形式存在的 其中a 和 b 就是键值对的key是由程序员自定的 前后端交互有三种方式 一种是query string ,form表单,json格式主流 三种都差不多具体用那种看个人习惯以及公司既定的代码风格 servlet 天然支持 query string 和 form表单而json本身是不支持的但是可以引入第三方库 1.GET请求
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/getParameter)
public class GetParameterServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//此处约定请求中给定的query string 例如:usernamezhangsanpassword123//上述 query string就会被tomcat 给自动解析成一个 Map 这样的结构//getParameter 就是在查询 MapString,String里的内容String username req.getParameter(username);String password req.getParameter(password);//就可以拿到这些内容之后做一些其他的任意处理System.out.println(username username);System.out.println(password password);resp.setContentType(text/html charsetutf-8);resp.getWriter().write(ok);}}不写string是这里是null 当写了我们自定义的username和password的时候这里就能看见显示的query string的内容了 但是有一个需要注意的点 当传入的query string的时候如果涉及到中文字符需要用urlencode去进行编码 如果不进行urlencode编码有些浏览器可能无法识别导致一些错误 encode之后的结果发送给浏览器浏览器能自动识别并进行urldecode解码 2.POST请求
import com.sun.prism.PresentableState;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/postParameter)
public class PostParameterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//约定前端构造形如这样的请求//POST / postParameter//Content-Type:x-www-form-urlencoded////usernamezhangsanpassword123//就需要在后端代码中把body中的值 给拿到//获取值的方法仍然是 getParameterString username req.getParameter(username);String password req.getParameter(password);System.out.println(username username);System.out.println(password password);resp.setContentType(text/html;charsetutf8);resp.getWriter().write(okk);}
}3引入json的第三方库jackson
1.json的第三方库有很多Jackson是spring官方推荐的库也被spring集成起来了对于后期学习spring比较方便 版本没有要求也没有必要太新稳定就行 选择2.15.0
将这个代码点击复制粘贴到pom.xml里点击maven的刷新键完成json第三方库安装 2.使用jackson一个类两个方法 一个类ObjectMapper 对象映射器 两个方法 1-把json字符串映射成一个Java对象。readValue Request request objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象反射2-把一个Java对象映射成json字符串 writeValueAsString String respJson objectMapper.writeValueAsString(response);网络传输使用json字符串。Java代码中各种逻辑使用Java对象。 站在服务器的角度收到的请求就是json字符串就需要把json字符串先映射成Java对象 再进行一系列的业务逻辑处理。处理完之后可能还需要把得到的Java对象映射会json字符串并通过响应来返回。 import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.org.apache.regexp.internal.RE;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;//把 json格式的字符串请求 映射后的 Java对象
class Request{public String username;public String password;
}
class Response{public boolean ok;
}
WebServlet(/json)
public class JsonParameterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//此处的约定请求格式如下//POST /json//Content-Type:application/json////{// username:zhangsan,// password:123//}//此处也约定响应的格式也按照 json 来组织//{// ok:true//}//把请求的 body 按照 json 格式解析成java对象ObjectMapper objectMapper new ObjectMapper();Request request objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象反射System.out.println(username request.username);System.out.println(password request.password);Response response new Response();response.ok true;//把响应对象转成 json 字符串String respJson objectMapper.writeValueAsString(response);resp.setContentType(application/json;charsetutf8);//设置字符集resp.getWriter().write(respJson);//返回json格式的字符串}
}4)总结如何进行前后端交互如何获取前端传来的数据
1.query string ( 使用 getParameter这个方法)
2.form表单 ( 使用 getParameter这个方法)
3.json(实际常用,导入json 的库 jackson使用objectMapper对象和json方法) 三、HttpServletResponse类 主要方法 1setStatus设置状态码 和 sendError 设置状态码同时设置body返回的内容
1.setStatus设置状态码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/Status)
public class StatusServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(404);//设置状态码为404 not found 找不到}
}光有状态码body里面没有内容是空的对用户不太友好浏览器里什么内容也没有不知道到底出现了什么问题 2.sendError 设置状态码同时设置body返回的内容
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/Status)
public class StatusServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setStatus(404);//设置状态码为404 not found 找不到resp.sendError(404,哎呀~网页找不到啦~是不是出现问题啦);}
}可以看到设置了状态码404 同时还设置了 提示内容 这个页面就是sendError生成的 2通过setHeader属性给响应中设置一些特殊的header
1.设置 refresh1让浏览器每秒刷新一次
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/refresh)
public class RefreshServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader(refresh,1);//refresh浏览器刷新1为时间每一秒刷新一次resp.getWriter().write( System.currentTimeMillis());//在浏览器显示当前时间}
}观察发现好像每次并没有精确1s刷新可能是一秒多一点
原因是浏览器响应也需要时间所以比原有的1s多一些 2.构造重定向响应 1-状态码是 3开头例如302 2-header 需要有一个Location属性描述要跳转到哪里 import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;WebServlet(/redirect)
public class RedirectServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//方法一resp.setStatus(302);resp.setHeader(Location,http://www.baidu.com);//重定向/redirect这个网页到 www.baidu.com//方法二resp.sendRedirect(http://www.baidu.com);//两者效果一致}
}这几个类学完就可以愉快的进行接下来的简单网站啦~~