servlet
🐲定义
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
🐲生命周期
😶从第一次接受请求开始到服务器关闭之后销毁
😶每次只会初始化一次
😶当配置了标签后,在开启tomcat之后就创建servlet,可设置优先级创建
🐲Service、doGet、doPost方法的区别
- Service:不管是get还是post请求方法,如果service方法存在,则有限执行service方法。
- doGet:在没有service的情况下,如果是get请求,调用doGet方法。
- doPost:在没有service的情况下,如果是post请求,调用doPost方法。
- 在编写servlet类时,不需要编写service,直接写doGet、doPost
🐲 @Override 注解:
- 指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素。
🐲 Servlet常见错误:
-
404:访问资源不存在
请求路径跟web.xml中填写的请求不一致
请求路径的虚拟名称填写错误
-
405:请求的方式跟servlet中支持的方式不一致
-
500:服务器内部错误
web.xml中servlet类的名称错误
servlet对应的处理方法中存在代码逻辑错误
🐲 Servlet系列之Request
url:统一资源定位符
uri:统一资源标识符
-
web.xml
<servlet> <servlet-name>Request</servlet-name> <servlet-class>com.ws.RequestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Request</servlet-name> <url-pattern>/request</url-pattern> </servlet-mapping>
-
RequestServlet
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post请求"); this.doGet(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get请求"); //请求行 //获取请求中的请求方式 String method = req.getMethod(); System.out.println(method); //获取请求的完整地址 StringBuffer url = req.getRequestURL(); System.out.println(url); //获取请求中的资源路径 String uri = req.getRequestURI(); System.out.println(uri); //获取请求中的协议 String schema = req.getScheme(); System.out.println(schema); //获取请求头数据 //获取请求头信息中的所有key的枚举对象 Enumeration<String> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = headerNames.nextElement(); String value = req.getHeader(key); System.out.println(value +":"+key); } //获取用户请求数据 //无论请求方式时post还是get,获取用户数据的方式不变 String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); String fav = req.getParameter("fav"); System.out.println(name + ":" + pwd + ":" +fav); //获取用户信息中的所有key Enumeration<String> parameterNames = req.getParameterNames(); while (parameterNames.hasMoreElements()){ System.out.println(parameterNames.nextElement()); } //获取相同key的多个数据值,例如checkbox String[] parameterValues = req.getParameterValues("fav"); for (String str:parameterValues) { System.out.println("fav :" + str); } //其他常用方法 String remoteAddress = req.getRemoteAddr(); String remoteHost = req.getRemoteHost(); int remotePort = req.getRemotePort(); System.out.println(remoteAddress+":"+remoteHost+":"+remotePort); }
🐲 Servlet系列之Response
- web.xml
<servlet>
<servlet-name>Response</servlet-name>
<servlet-class>com.ws.ResponseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response</servlet-name>
<url-pattern>/response</url-pattern>
</servlet-mapping>
-
ResponseServlet
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("this is post"); this.doGet(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("this is get"); //设置响应头,按照key-value键值对的方式来设置,如果存在相同的key,会把value的值覆盖 resp.setHeader("hehe","haha"); resp.addHeader("beijing","shanghai"); //固定属性,返回数据的格式用html标签显示 //服务端返回的对象数据按照一定的格式要求进行渲染,只有是html格式才会被识别标签 resp.setHeader("Content-Type","text/html"); resp.setHeader("Content-Type","text/plain"); // resp.setContentType("text/html"); //设置状态码 resp.sendError(404,"not fond"); resp.getWriter().write("<b> java is easy </b>"); //将内容写到客户端 }
🐲 Servlet乱码问题
- Post
- request.setCharacterEncoding(“utf-8”)
- Get请求
- 获取字符串之后使用new String(name.getBytes(“iso-8859-1”,“utf-8”))
- 设置request的编码格式,同时在service.xml中添加useBodyEncodingForURI=true的属性
- 在service.xml中添加URIEncoding=“utf-8”
- response响应编码
- response.setCharacterEncoding(“gbk”)
🐲 Servlet总结
servlet的流程处理:
- 设置请求编码格式
- 设置响应编码格式
- 接受请求端参数
- 进行逻辑代码处理
- 返回响应的结果