文章目录
一、Idea中编写Java web项目
1、建立tomcat和idea的关联
2、使用idea创建一个javaWEB工程
- 创建一个空项目之后
去搜索框里面搜索‘’添加框架支持‘’,添加Web组件。
javaWEB工程构建完成!
3、使用idea将工程构建成一个可以发布的app
4、使用idea将构建好的app部署到tomcat中启动运行
二、Servlet
2-1 概念
- Servlet 是Java提供的一门动态web资源开发技术
- Servlet 是JavaEE 规范之一,其实就是一个接口,定义Servlet类实现Servlet接口,并由web服务器运行Servlet
2-2 Request&Response
Request
- Request 继承体系
Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
使用request对象,查阅JavaEE API文档的HttpServletRequest接口
-
Request 获取请求数据
所有请求数据分为3部分- 请求行
//获取请求方式:get String method = req.getMethod(); System.out.println(method); //getcontextPath():获取虚拟目录(项目访问路径) String contextPath = req.getContextPath(); System.out.println(contextPath); //getRequestURL():获取URL(统一资源定位符): StringBuffer requestURL = req.getRequestURL(); System.out.println(requestURL); //getRequestURL():获URL(统一资源标识行): String requestURI = req.getRequestURI(); System.out.println(requestURI); //getQuerystring():获取消求参数(GET方式): String queryString = req.getQueryString(); System.out.println(queryString);
- 请求头:
String header = req.getHeader("user-agent"); System.out.println(header);
- 请求体:
BufferedReader reader = req.getReader(); String s = reader.readLine(); System.out.println(s);
-
Request 通用方式获取请求参数
思考:
GET 请求方式 和 POST请求方式 区别主要在于获取请求参数的方式不一样(String getQueryString()、BufferedReader getReader()),是否可以提供一种统一获取请求参数的方式,从而统一doGet和 doPost方法内的代码?
回答:
Request 首先通过不同的请求方式解析参数之后,再都使用Map集合存储请求数据的参数
Request 请求获取参数值的通用方法:
//1.Map集合获取参数值
Map<String, String[]> parameterMap = req.getParameterMap();
for(String key:parameterMap.keySet())
{
System.out.println(key+":");
//获取值 由于一个key里面可能存在多个值,所有获取的value是String[]型
String[] strings = parameterMap.get(key);
for (String s:strings)
{
System.out.println(s+" ");
}
System.out.println();
}
//2.根据key获取参数值,数组
String[] parameterValues = req.getParameterValues("hobby");
for (String s:parameterValues)
System.out.println(s+" ");
//3.根据key获取单个参数值
String username = req.getParameter("username");
System.out.println(username);
-
Request 请求转发
请求转发(forward):一种在服务器内部的资源跳转方式演示:
req.setAttribute("name","lee"); req.getRequestDispatcher("转发的目的的路径").forward(req,resp);
乱码问题
- POST乱码问题
//解决乱码
req.setCharacterEncoding("UTF-8");// Post是通过流来获取信息的,因此可以直接通过修改字符集,
//来解决乱码问题。
- Get乱码问题
- 问题分析
编码的时候是通过utf-8来进行编码,解码的时候却是通过ISO-8859-1进行解码
而tomcat解码的字符集是固定为ISO-8859-1,因此需要把 ISO-8859-1解码的信息原路返回为字节信息,再 通过utf_8进行解码。 - URL编码
1.将字符串按照编码方式转为二进制
2.每个字节转为2个16进制数并在前边加上%
- 代码演示
- 问题分析
String username="XX是你爸";
//编码 URLEncoder.encode
String encode = URLEncoder.encode(username, StandardCharsets.UTF_8);
System.out.println(encode);
//解码 URLDecoder.decode
//ISO-8859-1字符集
String decode1 = URLDecoder.decode(encode, StandardCharsets.ISO_8859_1);
System.out.println("ISO-8859-1:"+decode1);
//解决乱码问题; 乱码原因:tomcat进行URL解码,默认的字符集IS0-8859-1
String s = new String(decode1.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("解决之后:"+s);
Response
-
继承结构
-
Response 设置响应数据功能介绍
-
Response 完成重定向
重定向(Redirect):一种资源跳转方式
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)
两次请求,不能在多个资源使用request共享数据
什么路径下需要加虚拟路径—>明确路径谁使用
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
-
Response 响应字符数据
PrintWriter writer = resp.getWriter();
//设置响应头 resp.setContentType("text/html; charset=utf-8");//charset=utf-8 设置的是数据流出output的编码方式。 //获取字符流输出 PrintWriter writer = resp.getWriter(); writer.write("你好!"); writer.write("<h1>你好!</h1>"); //随着响应结束,response对象销毁,由服务器关闭 so 该流不需要关闭
-
Response 响应字节数据
ServletOutputStream outputStream = resp.getOutputStream();
// FileInputStream fileInputStream = new FileInputStream("///"); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); // ServletOutputStream outputStream = resp.getOutputStream(); // byte[] bytes=new byte[1024]; int line; while ((line=bufferedInputStream.read(bytes))!=-1) { outputStream.write(bytes,0,line); } // IOUtils.copy(bufferedInputStream,outputStream); 使用导入的依赖项,可以简化复制流程。 bufferedInputStream.close(); fileInputStream.close();
在pom文件中导入IO流相关工具类
<!--导入IO流相关工具类--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.7</version> </dependency>
2-3 Mybatis中SqlSessionFactory代码优化
-
问题分析: Java程序每一个servlet实例与数据库连接都需要引用一次mybatis核心配置文件,来获取连接数据库的对象
SqlSession
,这样太耗费资源了,性能很低,因此需要把以下共享的代码块调出来。String resource ="mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlsessionFactory = new SqlsessionFactoryBuilder().build(inputstream),
-
问题:
1.代码重复 :工具类
2.SqlSessionFactory 工厂只创建一次,不要重复创建:静态代码块 -
解决问题:创建工具类,设置该代码块为静态代码块
static
public class SqlSessionFactoryUtils { private static final SqlSessionFactory sqlSessionFactory; static { //静态代码块会随着类的加载而自动执行,且只执行一次 String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { throw new RuntimeException(e); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } }
三、JSP
3-1.概念
- Java Server Pages,Java服务端页面
- 一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容
- JSP = HTML + Java
- JSP的作用:简化开发,避免了在Servet中直接输出HTML标签
3-2.JSP 快速入门
- 导入JSP坐标
- 创建JSP文件
- 编写 HTML标签 和 Java代码
3-3.JSP 原理
- JSP 本质上就是一个 Servlet
- JSP 在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件
3-4.JSP 脚本
- JSP脚本用于在 JSP页面内定义Java代码
- JSP 脚本分类:
<%…%>:内容会直接放到 jspService()方法之中
<%=…%>:内容会放到out.print()中,作为out.print0)的参数
<%!..%>:内容会放到 jspService()方法之外,被类直接包含
3-5.JSP缺点
+由于 JSP页面内,既可以定义 HTML标签,又可以定义Java代码,造成了以下问题
1.书写麻烦:特别是复杂的页面
2.阅读麻烦
3.复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE.
4.占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
5.调试困难:出错后,需要找到自动生成的.java文件进行调试
6.不利于团队协作:前端人员不会 Java,后端人员不精 HTML
3-6.EL 表达式
- Expression Language 表达式语言,用于简化JSP页面内的Java代码
- 主要功能:获取数据
- 语法:
${expression}
获取域中存储的key为expression的数据 - JavaWeb中的四大域对象
1.page:当前页面有效
2.request:当前请求有效
3.session:当前会话有效
4.application:当前应用有效
EL表达式获取数据,会依次从这4个域中寻找,直到找到为止
3-7.JSTL 标签
- 概念:JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码
- 作用:结合El表达式,更好的在 HTML页面中使用Java语言
- 快速入门
1.导入坐标
2.在jsp页面引入JSTL标签库<!--JSTL --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
3.示范<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3-8.MVC 模式和三层架构
- MVC 是一种分层开发的模式,其中
M:Model,业务模型,处理业务
V:View,视图,界面展示
C:Controller,控制器,处理请求,调用型和视图 - MVC 好处
职责单一,互不影响
有利于分工协作
有利于组件重用
- 三层架构
1.数据访问层:对数据库的CRUD基本操作
2.业务逻辑层:对业务逻辑进行封装,组合数据访问层中基本功能,形成复杂的业务逻辑功能
3.表现层:接收请求,封装数据,调用业务逻辑层,响应数据
- MVC 模式和三层架构