一,需求
连接数据库 ,从数据库中获得商品的信息,并且显示到页面上
二,技术分析
1.JSP概述
Java server page(java服务器页面).JSP本质就是Servlet
它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP=html页面+java代码+jsp特有的内容(指令集、动作标签)
JSP产生原因:。
servlet在展示页面的时候,相当的繁琐。sun公司为了解决这个问题,参照asp开发了一套动态网页技术jsp。 php
设置eclipse里面jsp编码:
jsp运行原理
当服务器收到 .jsp的请求时,会指派一个名为JspBase的Servlet类出来处理这个请求。
JspBase把jsp页面,翻译成 java文件。java文件中就将html内容通过流写到客户端
java虚拟机编译java文件 成 class文件
从JspServlet 移交请求给我们刚刚编译好的class文件 。
由jsp转化成的那个class执行此次请求,并且输出数据内容到页面上。
其实我们的一个jsp 就是一个 servlet 类。
jsp里面写java代码(重点)
一、JSP Scriptlets: <% Java代码块 、变量声明 %>,声明的变量是局部变量
二、声明:<%! 声明全局变量或者方法 %> ,声明的变量是全局变量
三、以下的形式,用于赋值 <%=aa %> <%=bb %>直接在页面输出aa和bb变量的值。
jsp的注释(快速添加注释的快捷键Ctrl+shift+/)
<%-- --%> :这是jsp注释,但是这种注释的内容是,服务器看到之后都直接忽略,也不会输出到客户端,也就是查看源文件,是不会看到这段内容的。
: 这是html的注释 ,这行文字也会当做内容输出到客户端,虽然在网页上没有显示,但是查看源文件,是能看到这样内容的。 所以,使用HTML注释的话不安全,而且浪费用户的流量;而使用JSP注释的话,就相对较安全,节省用户流量
JSP的写法总结
遇到html标签就直接将这些html标签通过Writer的write方法写入客户端。
遇到<% %>标签中的Java代码就在jsp文件翻译成的Java代码的Service方法中执行这些Java代码,所以这种标签中声明的变量都是Service方法中的局部变量,这种标签中不能声明方法。
遇到<%! %>标签中的Java代码,都会在jsp文件翻译成的Java代码的类中执行这些代码,所以这种标签中声明的变量都是成员变量,而且这种标签中可以声明方法。
遇到<%= %>标签时,都会直接在客户端页面输出"="后面的变量值或者调用的方法的返回值。
5.JSP三大指令(了解)
指令作用:声明当前页面的一些属性和行为的
语法 <%@ 指令的类型 属性=属性值 属性=属性值 >
指令可以出现多次,位置随意,一般放在最上面
5.1 page指令:定义JSP文件中的全局属性.(了解即可)
isELIgnored 是否忽略EL表达式
重要的属性:
import:导包
pageEncoding:当前page(jsp页面)的编码 utf-8
Content-Type:就是设置响应体的内容的类型以及编码。
content:这是HTML文件中的编码格式
pageEncoding和Content-Type关系:
当两个都指定编码的时候,按照各自的指定的编码
当都不指定编码的时候,用默认的编码,iso8859-1
当两个只出现一个的时候,俩者都使用出现的指定的编码
5.2 include指令:用于引入其他的页面,是做静态包含(重点)
只有包含页面才翻译成.Java文件,被包含的页面不翻译成Java文件,直接将被包含文件的代码拷贝到包含文件中,然后由包含文件翻译成的java代码一起输出.
<%@ inlucde file="">
静态包含的特征:
1.静态包含的原理:其实就是将被包含文件的代码全部拷贝到包含文件中,然后一起翻译成Java文件,并使用输出流输出。
2.包含文件和被包含文件中,不能定义相同的变量。
3.只翻译包含文件,被包含文件不会被翻译。
5.3 taglib指令:用于引入标签库(jstl标签库)
<%@ taglib 属性 =属性值 %>
6.JSP九大内置对象(隐式对象)
系统给我们创建好了,不需要new,直接调用就可以了
对象 | 类型 | 说明 |
---|---|---|
request(域对象) | HttpServletRequest | request域对象 |
response | HttpServletResponse | 响应对象 |
session(域对象) | HttpSession | |
out | JspWriter | 用于往客户端页面写数据 |
exception | Throwable | 如果IsErroPage为true才能使用 |
application(域对象) | ServletContext | 相当于Servlet里面的ServletContext |
config | ServetConfig | |
page | Object(this) | 指当前的页面 |
pageContext(域对象) | PageContext | 当前页面的上下文,第四个域对象 |
response的方法:
response.setStatus(), 设置响应状态码----->重定向的时候设置status为302
response.setContentType("text/html;charset=utf-8");设置响应体的内容的类型和编码
response.sendRedirect("path");一句代码发起重定向
response.setHeader(),设置响应头
response.addHeader(),设置响应头
response.addCookie(),添加cookie
response.getWriter(),获取字符输出流
response.getOutputStream(),获取字节输出流
request的方法:
request.getMethod();获取请求方式
request.getRemoteAddr();获取客户端的IP地址
request.getContextPath();获取项目路径
request.getRequestUrl(),获取客户端的请求url地址
request.getParatemet(name);根据一个请求参数名获取一个请求参数值
request.getParameterValues(name);根据一个请求参数名获取对应的多个请求参数值
request.getParameterNames();获取所有的请求参数名
request.getParameterMap();获取所有请求参数的参数名和参数值,并存放在map中
request.setAttribute("name",object);作为域对象存数据
request.getAttribute("name");作为域对象取数据
request.getCookies();获取到请求中携带的所有cookie
request.getSession();获取session对象
request.getHeader(name);根据一个请求头的name获取一个值
request.getHeaders(name);根据一个请求头的name获取多个值
request.getHeaderNames();获取所有请求头的name
request.setCharacterEncoding("UTF-8");设置请求体的字符集----->解决post请求的中文乱码
request.getRequestDispatcher("path");获取请求转发分发器
7.四大域对象(重点)
类型 | 作用范围 |
---|---|
pageContext | 当前页面 |
request | 一次请求, 使用请求转发有效 |
session | 一次会话(多次请求), |
application | 整个应用 |
pageContext的作用
1.作为域对象存取值(当前页面) pageContext作为域对象基本没啥用
setAttribute(String name,Object obj);
getAttribute(String name);
removeAttribue(String name);(基本上用不到)
2.代替其它3个域对象存值(了解)
setAttribute(String name,Object obj, int scope);
3.获得其它8个内置对象(EL中会使用到)
getRequest(), getSession()....
4.便捷获得域(四个)对象的值 (重要)
pageContext.findAttribute(String name);依次从pageContext,request,session,application获取值,
如果找到,终止查找,立即把这个值返回
如果没有找到,返回null
8.六个动作标签(注意:标签体内如果不加param标签的话,开始标签和结束标签之间不要换行)
跳转到具体的页面
配合前面的forward来使用 ,表示跳转过去的时候,带参数过去。
写法如下:
-------------------------------------------------
也可以这么写
1获取参数:
收到来自首页的参数值:
<%=request.getParameter("username")%>
这个标签也是可以用作包含的, 效果上与前面的那个include一样,都能够显示包含的页面内容。
* jsp:include
使用方式如下:
动态包含
先把被包含的页面,做编译,然后得到输出的结果, 最后跟我们本来的页面结果一起输出。
不管是包含还是被包含,都被翻译成java文件。
* include指令集
静态包含
这里的包含是把被包含的页面的源代码原原本本的拿过来,组拼成一份新的html代码,然后一起输出
这里只会翻译一个JSP页面, 被包含的页面不会被翻译成java文件
动态包含和静态包含的区别
1.静态包含只会将包含文件翻译成java文件并编译成class文件,而动态包含中包含文件和被包含文件都会被翻译成java文件然后编译成class文件
2.静态包含发生在翻译期(就是翻译成java文件这个阶段已经包含好了),而动态包含发生在编译期
3.静态包含中包含文件和被包含文件中不能定义相同的变量名。
4.静态包含中只有一个request对象,而动态其实是包含页面将request转发到被包含页面,所以动态包含中在被包含页面能获取到包含页面中向下传递的参数。
一般都是用动态包含
下面三个标签用得很少(了解即可)
使用方式如下:
使用方式如下:
使用方式如下:
三,思路分析
四,代码实现
数据库的创建
create database jspda;
use jspda;
create table product(
pid int primary key auto_increment,
pname varchar(20),
price double,
pdesc varchar(100)
);
insert into product values (null,'电视机',2999.00,'乐视电视 送18个月会员');
insert into product values (null,'冰箱',4999.00,'海尔冰箱 省电');
insert into product values (null,'空调',1999.00,'格力空调 掌握核心科技');
insert into product values (null,'手机',999.00,'小米手机 充电5分钟 通话5分钟');
二、拷贝jar包和C3P0Utils、配置文件
三、代码实现
一、创建实体类(Bean)
二、创建一个index.jsp,访问index.jsp中的链接,找到ProductServlet
三、创建Servlet、Service、Dao
四、ProductServlet-------> ProductService------> ProductService
五、创建一个list.jsp遍历集合数据,显示在浏览器中