目录
JSONMybatis
花卉管理系统
什么是mybatis
普通环境搭建
搭建优化
三种查询方式
参数传递
增删改操作(基于sqlSession)
Mapper代理实现增删改查
多参传递
动态SQL
多表查询
resultType与resultMap的使用场景
Mybatis中的缓存
ThreadLocal
Mybaties注解支持
JSP
发布项目到服务器并访问
统计网站访问人数
jsp标签
Jsp模拟登陆
Servlet
可以用做动态网页开发
Servlet进行流程控制
生命周期
类加载的时机
API
参数读取
中文乱码问题
请求和响应
HttpServletRequest类
Base标签作用
web中的/
HttpServletResponse 类
请求重定向
Listener监听器
EL表达式
概念
EL 表达式搜索域数据的顺序
Empty
三元表达式
. 与 [ ] 运算
11个隐含对象
文件的上传和下载
文件的上传介绍(重点)
commons-fileupload.jar常用API说明
Cookie免用户名登录
Session
什么是session
Session的创建和获取
Session域对象的存取
Session生命周期控制
浏览器和Session之间的技术内幕
Filter
什么是过滤器
Filter的初体验
Filter 的生命周期
FilterCongif类
FilterChain 过滤器链
Filter的拦截路径
JSONJSON在JavaScript中的使用
JSON在java中的使用
AJAX请求
<code>目前需要创建的包</code>
dao dao.impl entity 存放实体 test 测试 util 工具
在实体类中,通常需要 实现 <code>序列化接口</code>
mybatis是一个半自动<code>ORM</code>框架
半自动:mybatis需要我们自己手写sql语句
<code>注意:</code> & 在xml中不能识别, 需要写成 <code>&amp;</code>
步骤
导包 书写配置文件 mybatis.xml 配置 Mapper.xml
<code>配置文件mybatis.xml</code>
``Mapper.xml`
<code>namespace规范参考</code>
cn.cqie.mapper.FlowerMapper
<code>配置别名</code>
在mybatis.xml中
属性的名称配置
<code>jdbc.properties</code>
<code>引入properties后的 value 变化</code>
settings开启log4j的支持
这里只弄了两种常用的
传入单个参数
传入对象
<code>#{id} #{name} 这里底层调用的 get方法</code>
传入map
insert
注意:mybatis默认不提交事务 ,需要我们自行提交
<code>两种方式设置提交</code>:
手动提交:在执行增加后,写 sqlSession.commit();
自动提交:SqlSession sqlSession = factory.openSession (true); 把true写进去
<code>返回值类型可以省略</code> test
delete
mapper
<code>这个param1可以写成 args0, 建议写 param1</code> test
update
test
sqlSession进行增删改查的缺点:
无法实现多参传递
书写的时候无接口,后期的维护就比较低
步骤:
在mapper包中编写接口,与xml文件
在mapper中的对应xml文件中关联接口,namespace="接口的路径" <code>直接copy reference</code>
mybatis.xml中扫描mapper中的对应xml文档
在mapper中对应xml文件中编写代码
编写test文件
<code>注意:</code>mapper中对应xml文件中的 id 应与 mapper 中接口的方法名对应(方法名要一样)
select,delete,update与insert类似
传的都是值,以select为例
<code>注意:</code>在xml中写sql语句时,select 的 一定要写返回类型
传的两个对象,以select为例
mybatis.xml文档的小优化
@Param方式
Flower selectOne2(@Param("uu") int id,@Param("yy") String name); sql语句中: #{uu} #{yy}
目前学习的内容sql语句都是直接写死的,但是在实际的开发过程中很多的sql语句都是根据不同的业务情况进行不同的改变的。 为了解决这个问题,就用sql语句的动态拼接
学习的标签:
<code>if</code> <code>where</code> when <code>set</code> trim <code>foreach</code> <code>bind</code> include sql
if标签
相当于 if() {}
when标签
相当于 if(){} else if(){}
Where标签的作用:会自动的增加where关键字,并且会把多余的第一个and去掉
foreach
另外一个动态 SQL 通用的必要操作是迭代一个集合, 通常是构建在 IN 条件中的。
<code>eg</code>
<code>其余功能参考说明文档</code>
bind
bind 就是在like后 ,通常在模糊查询中用
还有种方式 就是用 $符号 (会有sql注入风险)
sql include
sql定义公共的SQL代码片段 include 处就是替换原有的
业务代码查询A
就是先查询出所有的学生信息,然后根据学生信息查询班级信息。
业务代码查询B
类似于A
N+1方式查询
什么是N+1的查询方式? 如果没有N+1的方式我们想要实现多表的查询,自己书写查询的业务逻辑代码(java) mybatis希望通过自己标签配置的方式来解决这个问题 [2]执行的操作 查询学生所在班级的信息(一对一) 查询班级中所有学生的信息(一对多) 使用的时候书写标签需要注意: 查询出来返回的是一个对象:association 查询出来返回的是一个集合:collection 总结: 业务装配方式和N+1查询方式 共同点:执行SQL语句的条数上都是N+1条语句 不同点: 业务装配方式:是我们自己书写java代码的方式进行配置的 N+1方式:通过MyBatis标签配置的方式实现的
查询学生所在班级的信息(一对一)

如果你做的是单表的查询并且封装的实体和数据库的字段一一对应 resultType 如果实体封装的属性和数据库的字段不一致 resultMap 使用的是多表的联合查询 resultMap 使用N+1查询的时候 resultMap
sqlsession一级缓存
使用SqlSession对象操作数据库资源时,SqlSession对象会先去其缓存区查找是否有现成的符合要求的数据,如果有则返回,没有则按照需求进行数据库操作获取符合要求的资源,并将资源返回给用户的同时在其缓存中缓存,当我们使用同一个SqlSession对象操作同一个Sql资源时,就可以从缓存中直接获取数据库资源数据了
factory的缓存(二级缓存)
使用的方法: 在Mybatis.xml中开始二级缓存 在对应的mapper.xml文件中<cache readOnly="true"> 关闭获得提交指定的sqlsesson对象
注意 当用户查询时,会先在Factory对象自己的缓存中查看是否有现成的数据,有则直接返回,没有则继续查看sqlSession中是否有,有则返回,没有则去数据库中获取资源,将资源返回的同时在SqlSession的缓存中缓存一份儿,当该SqlSession对象被commit或者close时将其缓存的数据刷入到Factory中。 查询数据顺序 二级-->一级--->数据库--->把数据保存到一级,当sqlsession关闭或者提交的时候,把数据刷入到二级缓存中
网上查阅
接口中的代码
注解优缺点
使用注解没有实现java代码个sql语句的解耦 进行多表的查询比较的麻烦 无法实现sql语句的动态拼接
需求说明:
创建Web项目,开发静态页面 部署到服务器Tomcat 启动服务器Tomcat 不同用户通过浏览器来访问Web项目
本地地址:127.0.0.1
JSP = Java Server Pages
Sun公司推出的动态网页技术,类似的技术还包括ASP、PHP。相对的技术是HTML(静态网页技术) 动态生成网页数据,而不是有动态效果的网页! JSP是在HTML中嵌入Java脚本代码 JSP是服务器端技术(JavaScript是客户端技术) 由应用服务器来编译和执行嵌入的Java脚本代码,然后将生成的整个页面信息返回给客户端
JSP本质就是java
jsp文件
<code>小总结</code>
jsp的本质就是一个servlet(就是类)
在jsp页面中书写java代码的方式
小脚本 <% %>
表达式
声明式 <%! %>
小脚本和声明式的区别
小脚本声明的变量是局部变量,在声明式中声明的变量是成员变量
小脚本中不可以定义方法,在声明式中可以定义方法
小脚本可以使用jsp的内置对象,声明式中不可以 (比如 out)
注释
java中的三种注释
HTML的注释
jsp注释 <code>推荐使用:优点:节省网络的带宽,可以增快访问的速度</code>
include
<!--动态包含 ---动作标识 --> <% <jsp:include page="1.jsp"></jsp:include> %> <!--静态包含---指令标识 --> <%@include file="head.jsp" %>
forward param 使用方式同上
动态包含和静态包含的区别:
静态的引入式把代码原封不动的复制到主文件中,动态的引入是相当于方法的调用
静态的引入的方式引入文件和主文件中是不可以存在同名的变量 ,动态的引入可以存在
静态的引入式不会产生class文件 ,动态的引入式产生class文件
静态的引入产生的时机是第一个阶段 ,动态的引入式产生产生的时机是第三阶段
共同点:
都可以实现网页的引入
<code>login</code>
<code>doLogin</code>
浏览器端控制的跳转方式有几种?
直接输入URL地址 提交form表单 超链接方式
流程
首先写一个class类 去继承一个Httpservlet 重写service方法,注意一定要把super.service()去掉 进行动态网页的开发--那如何访问这个servlet呢?需要配置 在web.xml中进行配置
<code>MyServlet.java</code>
<code>web.xml</code>
<code>DoLogin.java</code>
servlet是一个单实例 多线程的程序
servlet的生命周期
【1】类加载
"com.bjsxt.servlet.LifeServlet"
Class clazz= Class.forName("com.bjsxt.servlet.LifeServlet");
【2】实例化 (离不开反射)
Object obj= clazz.newInstance();
【3】 初始化(离不开反射)
【4】服务请求(service)(离不开反射)
【5】 销毁操作(离不开反射)
【1】默认的情况是第一次访问servlet的时候进行类加载
【2】0(当启动服务器时候加载) 数字越小加载的时机越往前
Servlet接口:所有servlet必须直接或间接实现的类。 init( ServletConfig config ) service(ServletRequest req, ServletResponse res) destroy() getServletInfo():获得Servlet信息。 getServletConfig():获得Servlet配置相关信息 GenericServlet抽象类:implements Servlet, ServletConfig 定义了一个通用的,不依赖于具体协议的Servlet,给出了除service()方法外的其余四个方法的实现。 public void init(ServletConfig config) thows SerletExcepiton protected void init() thows SerletExcepiton 第一个是servlet接口的init(),调用第二个init(), 重写第二个init()即可 HttpServlet类 public void service(ServletRequest req, ServletResponse res) protected void service(HttpServletRequest req, HttpServletResponse res) protected void doGet(request,response) protected void doPost(request,response) public service()是父类的方法,protected service()是自己的方法。前者首先把参数分别转换为HttpServletRequest和HttpServletResponse ,再调用protected service(); protected service()根据HTTP请求方法的类型调用相应doXXX()方法 我们自己编写的servlet应该继承HttpServlet,一般要覆盖Service或者doPost/doGet方法。
设置编码 UTF-8;
<code>ParamServlet.java</code>
get方式和Post提交方式的区别
get数据的传输是不安全的 ,post数据传递更加安全
get方式数据传递有大小限制 post传输数据没有限制
get传输的数据速度比较快 post比较慢
解决post提交乱码
request.setCharacterEncoding
解决GET方式提交的乱码
方式1
byte [] bytes = str.getBytes("iso-8859-1");
String cstr = new String(bytes,"utf-8");
方式2
在server.xml中指定对应的服务器编码
URIEncoding="utf-8"
在JAVAEE 6 以上 支持<code>@WebServlet(/abc)</code>注解
i. getRequestURI() 获取请求的资源路径 ii. getRequestURL() 获取请求的统一资源定位符(绝对路径) iii. getRemoteHost() 获取客户端的ip 地址 iv. getHeader() 获取请求头 v. getParameter() 获取请求的参数 vi. getParameterValues() 获取请求的参数(多个值的时候使用) vii. getMethod() 获取请求的方式GET 或POST viii. setAttribute(key, value); 设置域数据 ix. getAttribute(key); 获取域数据 x. getRequestDispatcher() 获取请求转发对象
<code>ServletAPI.java</code>
<code>c.html</code>
<code>index</code>
/ 斜杠 如果被浏览器解析,得到的地址是: http://ip:port
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、/servlet1
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到http://ip:port/
HttpServletResponse 类和HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个Response 对象传 递给Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse 对象来进行设置
两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二级制数据) 字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。
往客户端回传数据
解决乱码问题
resp.setContentType("text/html;charset=UTF-8");
<code>注意:</code>这个要放在获取流对象之前。 这个同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
请求重定向的第一种方案: // 设置响应状态码302 ,表示重定向,(已搬迁) resp.setStatus(302); // 设置响应头,说明新的地址在哪里 resp.setHeader("Location", "http://localhost:8080"); 请求重定向的第二种方案(推荐使用): resp.sendRedirect("http://localhost:8080");
1、Listener 监听器它是JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监 听器。 2、Listener 它是JavaEE 的规范,就是接口 3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理
<code>MyServletListenerContextLisenerIMPL .java</code>
什么是EL表达式,EL表达式的作用?
EL 表达式的全称是:Expression Language 是表达式语言 EL表达式的作用:EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行输出。 因为EL表达式在输出数据的时候,要比jsp的表达式脚本简洁很多
<code>index.jsp</code>
EL表达式的格式: <code>${表达式}</code>
EL表达式在输出null值时,输出的是空串,jsp表达式输出的是null
EL表达式主要是在jsp页面中输出数据
主要是输出域对象中的数据
当四个域中都有相同的key的数据的时候,EL表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出
empty 运算可以判断一个数据是否为空,如果为空,则输出true,不为空输出false。 以下几种情况为空: 1、值为null 值的时候,为空 2、值为空串的时候,为空 3、值是Object 类型数组,长度为零的时候 4、list 集合,元素个数为零 5、map 集合,元素个数为零
表达式1?表达式2:表达式3
如果表达式1 的值为真,返回表达式2 的值,如果表达式1 的值为假,返回表达式3 的值。
.点运算,可以输出Bean 对象中某个属性的值。 []中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出map 集合中key 里含有特殊字符的key 的值。
EL 个达式中11 个隐含对象,是EL 表达式中自己定义的,可以直接使用。 变量 类型 作用 pageContext PageContextImpl 它可以获取jsp 中的九大内置对象 pageScope Map<String,Object> 它可以获取pageContext 域中的数据 requestScope Map<String,Object> 它可以获取Request 域中的数据 sessionScope Map<String,Object> 它可以获取Session 域中的数据 applicationScope Map<String,Object> 它可以获取ServletContext 域中的数据 param Map<String,String> 它可以获取请求参数的值 paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。 header Map<String,String> 它可以获取请求头的信息 headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况 cookie Map<String,Cookie> 它可以获取当前请求的Cookie 信息 initParam Map<String,String> 它可以获取在web.xml 中配置的上下文参数
pageScope ====== pageContext 域 requestScope ====== Request 域 sessionScope ====== Session 域 applicationScope ====== ServletContext 域
文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。
比如:QQ 头像,就使用了上传。
邮箱中也有附件的上传和下载功能。
OA 系统中审批有附件材料的上传。
要有一个form 标签,method=post 请求 form 标签的encType 属性值必须为multipart/form-data 值 在form 标签中使用input type=file 添加上传的文件 编写服务器代码(Servlet 程序)接收,处理上传的数据。
encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼
接,然后以二进制流的形式发送给服务器
<code>uploaded.jsp</code>
<code>ServletUpload.java</code>
commons-fileupload.jar 需要依赖commons-io.jar 这个包,所以两个包我们都要引入。
commons-fileupload.jar 和commons-io.jar 包中,我们常用的类有哪些?
类
作用
ServletFileUpload
用于解析上传的数据
FileItem
表示每一个表单项
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request)
判断当前上传的数据格式是否是多段的格式
public List parseRequest(HttpServletRequest request)
解析上传数据
boolean FileItem.isFormField()
判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
true 表示普通类型的表单项
false 表示上传的文件类型
String FileItem.getFieldName()
获取表单项的name 属性值
String FileItem.getString()
获取当前表单项的值
String FileItem.getName()
获取上传的文件名
void FileItem.write( file )
将上传的文件写到参数file 所指向抽硬盘位置
<code>login.jsp</code>
一个接口(HttpSession)
是会话
request.getSession()
第一次调用是:创建session 会话
之调用都是:获取前面创建好的Session会话对象
isNew() 判断是不是刚创建出来的(新的)
true: 表示刚创建
false:获取之前的创建
每一个会话都有一个身份证号码。也就是ID值,ID值是惟一的。
getId() 得到session的id 值
<code>SessionServlet.java</code>
public void setMaxInactiveInterval(int interval) 设置Session 的超时时间(以秒为单位),超过指定的时长,Session
就会被销毁。
值为正数的时候,设定Session 的超时时长。
负数表示永不超时(极少使用)
public int getMaxInactiveInterval() 获取Session 的超时时间
public void invalidate() 让当前Session 会话马上超时无效。
Session 默认的超时时长是多少!
Session 默认的超时时间长为30 分钟。
因为在Tomcat 服务器的配置文件web.xml 中默认有以下的配置,它就表示配 置了当前Tomcat 服务器下所有的Session
超时配置默认时长为:30 分钟。
如果说。你希望你的web 工程,默认的Session 的超时时长为其他时长。你可以在你自己的web.xml 配置文件中做
以上相同的配置。就可以修改你的web 工程所有Seession 的默认超时时长。
<code>Session销毁</code>
Session 技术,底层其实是基于Cookie 技术来实现的。
1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
2、Filter 过滤器它是 JavaEE 的规范。也就是接口
3、Filter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
……等等
要求:要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必
须是用户登录之后才允许访问。
思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否
登录,可以判断 Session 中否包含有用户登录的信息即可!!!
Filter的工作流程
<code>AdminFilter.java</code>
Filter 过滤器的使用步骤:
1、编写一个类去实现 Filter 接口
2、实现过滤方法 doFilter()
3、到 web.xml 中去配置 Filter 的拦截路径
完善的用户登录
<code>LoginServlet.java</code>
Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,会销毁 Filter 过滤器)
FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、获取 Filter 的名称 filter-name 的内容
2、获取在 Filter 中配置的 init-param 初始化参数
3、获取 ServletContext 对象
<code>java代码</code>
注意: 的位置
精确匹配:
<url-pattern>/target.jsp</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
目录匹配:
<url-pattern>/admin/*</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
后缀名匹配:
<url-pattern>*.html</url-pattern>
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON
采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python
等)。 这样就使得 JSON 成为理想的数据交换格式。
json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式
json定义:json 是由键值对组成,并且由花括号包围,每个键由引号引起来,键和值之间使用冒号进行分隔,多组键值对之间用逗号进行分隔。
JSON的两个常用方法:
JSON的存在有两种形式。
对象的形式存在,叫做json对象
字符串的形式存在,叫做json字符串
一般我们要操作JSON中的数据的时候,需要JSON对象的格式。
一般我们要在客户端和服务器之间进行数据交换的时候,使用JSON字符串
JSON.stringify() 把JSON对象转换成json字符串
JSON.parse() 把JSON字符串转换成JSON对象
<code>JsonTest.java</code>
AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发
技术。
ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容
本文来自博客园,作者:chn-tiancx,转载请注明原文链接:https://www.cnblogs.com/tiancx/p/15359127.html