目录
2.3本地集成使用tomcat或者远程使用(用坐标导入tomcat插件)。
一、http协议
二、tomcat服务器
2.1运行窗口乱码问题
conf目录下修改日志文件(logging.properties)中的编码格式,因为window的运行窗口编码格式为GBK,而tomcat的日志信息为UTF-8。
java.util.logging.ConsoleHandler.encoding = GBK
2.2默认端口号修改
在server.xml直接修改,默认为8080。
2.3本地集成使用tomcat或者远程使用(用坐标导入tomcat插件)。
三、servlet
3.1坐标导入
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
其中的<scope>provided</scope>为编译环境和测试环境有效,在运行环境无效。在web项目中打包后不会生成其jar包,因为tomcat自带其jar包。
3.2Servlet生命周期
1)Servlet对象由Servlet容器(web服务器)创建,当loadOnStartup为默认值时(负数),第一次访问创建,0或正整数时则容器启动时创建。创建之后会被init()方法初始化并加载配置文件。
2)init()方法只会执行一次,当Servlet对象被创建时被调用。
3)service()方法在每一次访问时都会被调用。
4)destroy()方法在容器关闭时被调用,并且只调用一次用来销毁Servlet对象。
3.3getServletConfig()用来获取一个配置对象, 把init()方法中的参数赋值给一个全局变量,在getServletConfig()方法中return该全局变量即可。
5)urlpattern
精确匹配
目录匹配
扩展名匹配
任意匹配(不推荐,因为会覆盖xml中的默认匹配方式导致无法访问静态资源)
3.3request
1)获取请求行
String getMethod(); //获取请求方式
String getContextPath(); //动态获取虚拟路径(项目访问路径)
StringBuffer getRequestURL(); //获取url(统一资源定位符),需要调用toString()方法转换为String
String getRequestURI(); //获取统一资源标识符
String getQueryString(); //获取get方式的请求参数
2)请求头
String getHeader(String name); //根据请求头名称获取请求头
3)请求体
ServletInputStream getInputStream(); //获取字节输入流(比如上传文件)
BufferReader getReader(); //获取字符输入流
总结:get方式:用getQueryString()方法获取请求参数
post方式:用getReader()方法获取请求参数
3.4统一获取参数的方式
1)Map<String,String[]> map=req.getParameterMap();//获取所有参数
2)根据键值获取对应的值(数组)
String values=req.getParameterValues();
3)根据键值获取对应的值(单个)
String username=req.getParameter("username");
3.5中文参数乱码问题
post方式:req.setCharacterEncoding("UTF-8");//设置字符输入流为UTF-8解决中文数据乱码。
get方式:
//get请求方式解决乱码问题
//乱码原因(url编码和解码的指定的方式不一样,浏览器是用utf-8,tomcat用的是iso-8859-1)
//解决方法(把tomcat解码后的数据编码为字节数组,再用utf-8的方式解码)
byte[] bytes=username.getBytes(StandardCharsets.ISO_8859_1); //编码
username=new String(bytes,StandardCharsets.UTF_8);//解码
注意:tomcat8版本以后已经自动解决了get的方式乱码问题。
3.6资源转发
1)
//存储键值对到req中
req.setAttribute("msg","HelloWorld!");
//实现跳转
req.getRequestDispatcher("/FourthHttpServlet").forward(req,resp); //资源跳转到另一个servlet中
//实现数据转发(由el表达式接收)
req.getRequestDispatcher("/xxx.jsp").forward(req,resp);
2)获取共享的数据
Object msg = req.getAttribute("msg"); //获取共享的数据
3.7资源重定向
//1.设置重定向响应状态码302
resp.setStatus(302);
//2.设置重定向的请求头和访问资源路径
resp.setHeader("Location","/servlet-demo/resp2");
//3.简化方式完成重定向,并且动态获取虚拟目录 resp.sendRedirect(req.getContextPath()+"/resp2");
3.8响应字符和字节数据
1)字符数据
/* response响应字符数据 */ //1.解决中文乱码问题 resp.setContentType("text/html;charset=utf-8"); //解析方式为html,utf-8 //2.获取字符输出流 PrintWriter writer=resp.getWriter(); writer.write("aaa"); writer.write("<h1>aaa</h1>");
2)响应字节数据
/* response响应字节数据 */ //1.读取文件 FileInputStream fis=new FileInputStream("d://壁纸.jpg"); //2.获取response字节输出流 ServletOutputStream os=resp.getOutputStream(); //3.完成流的copy IOUtils.copy(fis,os); //4.关闭输入流 fis.close();
四、jsp
导入坐标->创建jsp文件->编写html和java代码
4.1el表达式原样输出问题
版本问题。
解决方法:把以下表达式添加到图片的位置。
isELIgnored="false"
4.2jstl标签(if&foreach)
1)导入jstl坐标->导入standard坐标
2)引用标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
五、MVC三层架构模式
5.1三层架构
1)数据访问成:对数据库的基本操作(dao/mapper)
2)业务逻辑层:对业务逻辑进行封装,组合数据访问层(service)
3)表现层:接受请求,封装数据,调用业务逻辑层,响应数据(web/controller)
六、会话跟踪技术(cookie&session)
1.cookie:服务端把cookie数据发送到客户端保存。
发送cookie:
1)创建对象
Cookie cookie=new Cookie("name","value");
2)发送cookie
resq.addCookie(cookie);
获取cookie
1)接收来自客户端所有的cookie
Cookie[] cookies=req.getCookies();
2)遍历cookie数组,获取需要的cookie对象
for (Cookie cookie : cookies) {
if("username".equals(cookie.getName())){
String value=cookie.getValue();
String name=cookie.getName();
System.out.println(name+":"+value);
break;
}
}
cookie存活时间
cookie.setMaxAge(存活秒数);
cookie无法存储中文问题
解决方法:url编码后再解码
1)URL编码
String value="张三";
//URL编码
value= URLEncoder.encode(value,"utf-8");
Cookie cookie=new Cookie("username",value);
2)URL解码
String value=cookie.getValue();
value= URLDecoder.decode(value,"utf-8");
3)cookie把数据发送到客户端由jsp编写el表达式接收(记住密码需求)
value="${cookie.username.value}
总结:编码URLEncoder.encoder(要编码的变量,"编码方式")
解码URLDecoder.decode(要解码的变量,"解码方式")
2.session
1)创建session对象
HttpSession session=req.getSession();
2)在session里面存储数据
session.setAttribute("键名","键值");
3)获取session中的数据
Object username=session.getAttribute("username");
4)session的钝化、活化
5)session销毁
session.invalidate();
总结: