使用post提交的时候参数有中文时,在接收页面接收前必须对参数进行编码
request.setCharacterEncoding("UTF-8");
解决获取中文乱码问题
使用URLEncoder解决无法在Cookie当中保存中文字符串问题
request.setCharacterEncoding("utf-8");
String username = URLEncoder.encode(request.getParameter("username"),"utf-8");
String password = URLEncoder.encode(request.getParameter("password"),"utf-8");
URLEncoder就是将URL中特殊部分进行编码。URLDecoder就是对特殊部分进行解码
将要显示的文字进行URLDecoder解码
JSP全程Java Server Pages,是一种动态网页开发技术
- 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件
- 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本
- JSP基于Java Servlets API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等
- JSP页面可以与处理业务逻辑的servlets一起使用,这种模式被Java servlet 模板引擎所支持
JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用
- 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
- 与纯 Servlets相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
- 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
- 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
- 与静态HTML相比:静态HTML不包含动态信息
- JSP结构
JSP常用的三个page指令:language表示编程语言、import表示导入的java包、contentType表示文件格式和字符编码
JSP三大指令元素:include、page、taglib
JSP注释:
1、HTML的注释: <!--html注释--> //客户端可见
2、JSP的注释: <%--html注释--%> //客户端不可见
3、JSP脚本注释: //单行注释 /**/多行注释
JSP声明:
<%! Java代码%>
JSP表达式:
<%=表达式%> //注意:表达式不以分号结束
以返回值的方式打印内容
<%=printMultiTable2(out) %>
以脚本的方式输出内容
<%printMultiTable2(out); %>
JSP内置对象
1、内置对象简介
jsp内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象
内置对象 描述
pageContext JSP的页面容器
request 得到用户的请求信息
response 服务器想用户端的回应信息
session 用来保存每一个用户的信息
application 表示所有用户的共享信息
config 服务器配置,可以取得初始化参数
out 页面输出(向浏览器输出)
page 表示从页面中显示出来一个Servlet实例
exception 表示JSP页面所发生的异常,在错误页中才起作用
2、四种作用域范围
page:只在一个页面中保存属性,跳转之后无效
request:只在一次请求中保存属性,服务器跳转后依然有效
session:在一次会话范围中保存,无论何种跳转都可以使用,但是新开浏览器无法使用
application:在整个服务器上保存,所有用户都可以使用
3、out
out对象常用方法如下:
1、void println()向客户端打印字符串
2、void clear()清除缓冲区的内容,如果在flush之后调用会抛出异常
3、void clearBuffer();清除缓冲区的内容,如果在flush之后调用不会抛出异常
4、void flush()将缓冲区内容输出到客户端
5、int getBufferSize()返回缓冲区以字节数的大小,如不设缓冲区则为0
6、int getRemaining()返回缓冲区还剩余多少可用
7、boolean isAutoFlush()返回缓冲区满时,是自动清空还是抛出异常
8、void close()关闭输出流
4、request/response
获取单个数据:<%=request.getParameter("username") %><br>
获取多个数据:<%String [] favorites = request.getParameterValues("favorite");
for(int i=0 ; i<favorites.length;i++){
out.println(favorites[i]+" ");
}
%>
存储请求中的属性和返回指定属性的属性值:
<%request.setAttribute("password","123456");%>
密码:<%=request.getAttribute("password") %>
请求体的MIME类型:<%=request.getContentType() %><br>
协议类型及版本号:<%=request.getProtocol() %><br>
服务器主机名:<%=request.getServerName() %><br>
服务器端口号:<%=request.getServerPort() %><br>
请求文件的长度:<%=request.getContentLength() %><br>
请求客户端的IP地址:<%=request.getRemoteAddr() %><br>
请求的真实路径:<%=request.getRealPath("dologin.jsp") %><br>
请求的上下文路径:<%=request.getContextPath() %> <br>
重定向: response.sendRedirect("dologin.jsp");
请求转发: request.getRequestDispatcher("request.jsp").forward(request,response);
5、session
当把所有和对应网站的页面都关了,那么,该网站分配给该用户的session结束
getCreationTime()会返回session创建时间,但是是一个数字串,要通过SimpleDateFormat该格式
<% SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
%>
session创建时间:<%=sdf.format(d) %>
session的ID编号:<%=session.getId() %><br>
定义属性,即使页面调转也可以获取
session.setAttribute("username","admin");
session中获取用户名:<%=session.getAttribute("username") %><br>
获取所有定义好的session属性的名称:
String [] names = session.getValueNames();
for(int i = 0 ; i<names.length;i++)
{
out.println(names[i]+" ");
}
设置当前session最大生成期限 单位是秒
session.setMaxInactiveInterval(10);
1
setProperty动作会自动将表单提交的内容自动匹配到javaBean中(实例化并且赋值)
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty动作元素</h1>
<hr>
<!-- 根据表单自动匹配所有的属性 -->
<jsp:setProperty property="*" name="myUsers"/>
2
根据自己设定固定的几个属性匹配
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty动作元素</h1>
<hr>
<!-- 根据表单自动匹配所有的属性 -->
<jsp:setProperty property="username" name="myUsers"/>
3
和表单无关,自己设置值给javabean
<jsp:setProperty
property="username"
name="myUsers"
value="冰玉"/>
<jsp:setProperty
property="password"
name="myUsers"
value="88888"/>
4
跟request参数关联
通过URL传参数给属性赋值
<jsp:setProperty
property="password"
name="myUsers"
param="mypass"/>
根据地址栏的参数名获取参数值赋值给property
getProperty
<!-- 使用传统的表达式获取用户名和密码 -->
用户名:<%=myUsers.getUsername()
%><br>
密码:<%=myUsers.getPassword()
%><br>
<!-- 使用getProperty方式获取用户名和密码 -->
用户名:<jsp:getProperty
property="username"
name="myUsers"/><br>
密码: <jsp:getProperty
property="password"
name="myUsers"/><br>
forward动作
语法:
<jsp:forward page="URL"/>
等同于: request.getRequestDispatcher("/url").forward(request,response);
<jsp:forward page="user.jsp"/> 相当于服务器内部跳转
等价于: <% request.getRequestDispatcher("user.jsp").forward(request,response); %>
Param动作
语法: <jsp:param name="参数名" value="参数值">
常常与<jsp:forward>一起使用,作为其的子标签
在使用forward跳转之前可通过Param动作传递一些参数
在跳转后的页面使用 request.getParameter("name");来获取
实现DBHelper类型
String driver = "com.mysql.jdbc.Driver"; //数据库驱动
//链接数据库的URL地址
String url = "jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8
String username="root"; //数据库的用户名
String password=""; //数据库的密码