一、JavaWeb简介
1、C/S:在服务器中主要是一个数据库,所有的业务逻辑以及界面都交给客户端完成
B/S:基于浏览器访问的应用
2、静态网页:Web页面中供人们浏览的数据始终不变
动态网页:数据由程序产生
3、WEB-INF的目录结构:
WEB-INF是Java的Web应用的安全目录。安全是指客户端无法访问,只有服务器端可以访问。
1)web.xml,项目部署文件
2)classes文件夹,用以放置*.class文件
3)lib文件夹,用于存放需要的jar包。
二、JSP基础语法
1、Jsp指令:
1)page指令 通常位于jsp页面的顶端,同一个页面可以有多个page指令
2)include指令 将一个外部文件嵌入到当前jsp文件中,同时解析这个页面中的Jsp语句
3)taglib指令 使用标签库定义新的自定义标签,在Jsp页面中启用定制行为
<%@ page 属性1=“属性值” 属性2=“属性值”%>//@和page中间有一个空格
2、Jsp注释:
HTML的注释:
<!--html--> //客户端可见(查看源文件)
Jsp的注释:
<%--html--%> //客户端不可见
Jsp脚本中的Java注释:
//单行注释 /**/多行注释 //客户端不可见
3、Jsp脚本
在Jsp页面中执行的java代码,<%代码%>
例如:<%out.print("大家好") ;%>
4、Jsp声明
在JSP页面中定义变量或者方法,<%!Java代码%>
例如:
<%!
String s="张三";
int add(int x,int y)
{
return x+y;
}
%>
5、Jsp表达式
在Jsp页面中执行的表达式,<%=表达式%> //注意:表达式不已分号结束
例如:
<%=s %>
x+y=<%=add(10,5) %>
打印九九乘法表
<h1>打印九九乘法表</h1>
<%!
//使用表达式
String printMultiTable1(){
String s="";
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
s+=i+"*"+j+"="+i*j+"    ";
}
s+="<br>";
}
return s;
}
%>
<%!
//使用Jsp脚本
void printMultiTable2(JspWriter out) throws Exception{
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
out.print(i+"*"+j+"="+i*j+"    ");
}
out.print("<br>");
}
}
%>
<%=printMultiTable1() %>
<br>
<%printMultiTable2(out); %>
<br>
三、JSP内置对象
1、JSP九大内置对象
常用:out、request、response、session、application对象
另外还有Page、pageContext、exception、config等
2、out对象
out对象是JspWriter类的实例,是向客户端输出内容的常用对象。
常用方法如下:
void println() 向客户端打印字符串
void clear() 清除缓冲区内容,如果在flush之后调用会抛出异常
void claerBuffer() 清除缓冲区的内容,如果在flush之后调用不会抛出异常
void flush() 将缓冲区内容输出到客户端
void getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
void getRemaining() 返回缓冲区还剩多少可用
boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
void close() 关闭输出流
3、请求方式:GET、POST,共8种请求方式(HEAD、PUT、DELETE)。
GET请求和POST请求的区别:
GET请求用于获取数据,能在地址栏看到,不安全,大小受限制,不支持二进制流。搜索、查询等
POST请求主要是为了将数据传到服务器端,支持二进制流。注册、修改、上传等
4、request对象
是HttpServletRequest类的实例
String getParameter(String name) 返回name指定参数的参数值
String[] getParameterValues(String name) 返回包含参数name的所有值的数组
void setAttribute(String,Object) 存储此请求中的属性
void getAttribute(String name) 返回指定属性的属性值
String getContentType() 得到请求体的MIME类型
String gteProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求的服务器主机名
例如:
login.jsp
<h1>用户登录</h1>
<hr>
<form action="doLogin.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="passWord"></td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="favorite" value="read">读书
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="movie">电影
<input type="checkbox" name="favorite" value="internet">上网
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
<a href="doLogin.jsp?userName=李四">URL传参</a>
doLogin.jsp
<%
request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL中文传参问题
%>
用户名:<%=request.getParameter("userName") %><br>
爱好:<%
if(request.getParameterValues("favorite")!=null){
String[] favorite=request.getParameterValues("favorite");
for(int i=0;i<favorite.length;i++)
out.print(favorite[i]+" ");
}
%>
URL中文传参乱码问题在server.xml中修改
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
在最后加上URIEncoding="utf-8"
5、response对象
response对象通过getWriter()获得的对象在打印时提前于out对象。
请求重定向:例如<%response.sendRedirect("login.jsp"); %>
请求重定向:
login.jsp
<h1>用户登录</h1>
<hr>
<form action="response.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="passWord"></td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="favorite" value="read">读书
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="movie">电影
<input type="checkbox" name="favorite" value="internet">上网
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
<a href="doLogin.jsp?userName=李四">URL传参</a>
response.jsp
<%response.sendRedirect("doLogin.jsp"); %>
doLogin.jsp
<%
request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL中文传参问题
%>
用户名:<%=request.getParameter("userName") %><br>
爱好:<%
if(request.getParameterValues("favorite")!=null){
String[] favorite=request.getParameterValues("favorite");
for(int i=0;i<favorite.length;i++)
out.print(favorite[i]+" ");
}
%>
请求转发:
response.jsp
<%request.getRequestDispatcher("doLogin.jsp").forward(request, response); %>
(地址栏,能不能获得用户名和爱好)
6、session对象
在服务器的内存中保存着不同用户的session
例如:
session1.jsp
<%
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
Date d=new Date(session.getCreationTime());
String s=sdf.format(d);
session.setAttribute("userName", "王五");
session.setAttribute("passWord", "123123");
session.setAttribute("age", 24);
%>
<%=s %>
<br/>
<%=session.getAttribute("userName") %>
<br/>
<%=session.getId() %>
<br>
<a href="Session2.jsp" target="_black">跳转到session2.jsp页面</a>
session2.jsp
<%=session.getAttribute("userName") %>
<br>
<%=session.getId() %>
<br>
<%
String[] values=session.getValueNames();
for(int i=0;i<values.length;i++)
out.print(values[i]+"  ");
%>
session生命周期:创建、活动、销毁
7、application对象
例如:
<%
application.setAttribute("name", "李四");
application.setAttribute("city", "BeiJing");
application.setAttribute("sex", "male");
%>
<%=application.getAttribute("name")%>
<br>
<%
Enumeration a=application.getAttributeNames();
while(a.hasMoreElements())
out.print(a.nextElement()+" ");
%>
<br>
<%=application.getServerInfo() %>
8、page对象
9、pageContext对象
10、Config对象
11、Exception对象
例如:
exception_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" errorPage="exception.jsp"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
System.out.println(100/0);//控制台输出
//out.print(100/0); //页面输出
%>
</body>
</html>
exception.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
<html>
<head>
</head>
<body>
<%=exception.getMessage() %>
<br>
<%=exception.toString() %>
</body>
</html>
四、JavaBean
1、JSP动作元素
2、<jsp:useBean>
项目src下新建一个com.po包,包内新建一个Users.class。
package com.po;
public class Users {
private String userName;
private String password;
public Users(){}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
WebRoot下的userBean.jsp
<jsp:useBean id="myUser" class="com.po.Users" scope="page"></jsp:useBean>
用户名:<%=myUser.getUserName() %><br>
密码:<%=myUser.getPassword() %>
得到的用户名和密码是空值,需要通过<jsp:setProperty>设置
3、<jsp:setProperty>
前三种
com.po下的Users.class见上
login.jsp
<h1>用户登录</h1>
<hr>
<form action="javabean/dologin.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
dolgin.jsp
<%request.setCharacterEncoding("utf-8"); %>
<jsp:useBean id="myUser" class="com.po.Users" scope="page"></jsp:useBean>
<!-- 第一种:login.jsp表单中名字自动与JavaBean中的属性名匹配 -->
<%-- <jsp:setProperty property="*" name="myUser"/> --%><!-- name表示要实例化的javaBean,与id一样 -->
<!-- 第二种:密码为空 -->
<%-- <jsp:setProperty property="userName" name="myUser"/> --%>
<!-- 第三种:与表单无关,手工赋值 -->
<%-- <jsp:setProperty property="userName" name="myUser" value="张三"/>
<jsp:setProperty property="password" name="myUser" value="123"/> --%>
用户名:<%=myUser.getUserName() %><br>
密码:<%=myUser.getPassword() %>
第四种
login.jsp的form改变,其他不变
<form action="javabean/dologin.jsp?mypass=999" name="loginForm" method="post">
dologin.jsp
<!-- 第四种:通过URL传参的方式给属性赋值 -->
<jsp:setProperty property="userName" name="myUser"/><!-- userName通过表单传值 -->
<jsp:setProperty property="password" name="myUser" param="mypass"/><!-- password通过URL传值 -->
用户名:<%=myUser.getUserName() %><br>
密码:<%=myUser.getPassword() %>
4、<jsp:getProperty>
把上述
用户名:<%=myUser.getUserName() %><br>
密码:<%=myUser.getPassword() %>
改为
<jsp:getProperty property="userName" name="myUser"/>
<jsp:getProperty property="password" name="myUser"/>
5、JavaBean的作用域范围
6、jsp+JavaBean实现用户登录(没有连接数据库,密码写死)
com.po下的Users.class见上
com.dap下的UsersDAO.class
package com.dao;
import com.po.Users;
public class UsersDAO {
public boolean usersLogin(Users u){
if("admin".equals(u.getUserName()) && "admin".equals(u.getPassword())){
return true;
}
else{
return false;
}
}
}
WebRoot下的login.jsp见上
dologin.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<jsp:useBean id="loginUser" class="com.po.Users" scope="page"></jsp:useBean>
<jsp:useBean id="userDao" class="com.dao.UsersDAO" scope="page"></jsp:useBean>
<jsp:setProperty name="loginUser" property="*" />
<%
request.setCharacterEncoding("utf-8");
if (userDao.usersLogin(loginUser)) {
session.setAttribute("userName", loginUser.getUserName());
request.getRequestDispatcher("loginSuccess.jsp").forward(
request, response);
}
else{
response.sendRedirect("loginFail.jsp");
}
%>
loginSuccess.jsp
<h1><%=session.getAttribute("userName") %>登录成功</h1>
loginFail.jsp
<h1>登录失败,请重新登录</h1>
<a href="javabean/login.jsp">返回</a>
五、JSP状态管理
1、http协议的无状态性
当浏览器发送请求给服务器的时候,服务器响应客户端的请求
但是当同一个浏览器再次发送请求给服务器的时候,服务器不知道它就是刚才的浏览器
2、cookie
保存用户状态的两大机制
1)session
2)cookie
cookie是Web服务器保存在客户端的一系列文本信息
创建Cookie实现记忆用户名和密码:
login.jsp
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>用户登录</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
if(c.getName().equals("username")){
username=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")){
password=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<form action="dologin.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="<%=username %>"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="<%=password %>"></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked">是否记住用户名和密码</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
dologin.jsp
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>登录成功</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String[] isUseCookies=request.getParameterValues("isUseCookie");
if(isUseCookies!=null && isUseCookies.length>0){
//使用URLEncoder解决无法在Cookie中保存中文字符串问题
String username=URLEncoder.encode(request.getParameter("username"), "utf-8");
String password=URLEncoder.encode(request.getParameter("password"), "utf-8");
Cookie usernameCookie=new Cookie("username",username);
Cookie passwordCookie=new Cookie("password",password);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
}else{
Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
if(c.getName().equals("username") || c.getName().equals("password")){
c.setMaxAge(0);//设置cookie失效
response.addCookie(c);//重新保存
}
}
}
}
%>
<a href="users.jsp" target="_black">查看用户信息</a>
</body>
</html>
users.jsp
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>用户信息</h1>
<br>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
if(c.getName().equals("username")){
username=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")){
password=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<br>
<br>
用户名:<%=username %>
密码:<%=password %>
</body>
</html>
3、session和cookie的对比
六、JSP指令与动作
1、include指令和include动作的例子:
date.jsp
<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
<%
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM日dd月");
String s=sdf.format(d);
out.print(s+"<br>");
%>
includeCommand.jsp
<h1>Include指令</h1>
<%@ include file="date.jsp" %>
或includeAction.jsp
<h1>Include动作</h1>
<jsp:include page="date.jsp" flush="false"></jsp:include><!-- flush:被包含的页面是否从缓冲区读取-->
include指令与include动作区别:
2、forward动作
<jsp:forward page="URL"/>
等同于
request.getrequestDispatcher("/url").forward(request,response);
例如:
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>用户登录</h1>
<hr>
<form action="chap7/forwardAction.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
forward.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>forward动作</h1>
<jsp:forward page="users.jsp"></jsp:forward>
</body>
</html>
users.jsp
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>用户信息</h1>
<br>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
if(request.getParameter("username")!=null)
username=request.getParameter("username");
if(request.getParameter("password")!=null)
password=request.getParameter("password");
%>
<br>
用户名:<%=username %>
密码:<%=password %>
</body>
</html>
3、param动作
login.jsp的from表单的action改为doLogin.jsp,其余同上
dologin.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<!-- 可以添加新的参数,也可以修改已有的参数 -->
<jsp:forward page="users.jsp">
<jsp:param value="123@qq.com" name="email"/>
<jsp:param value="111" name="password"/>
</jsp:forward>
</body>
</html>
users.jsp
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<h1>用户信息</h1>
<br>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
String email="";
if(request.getParameter("username")!=null)
username=request.getParameter("username");
if(request.getParameter("password")!=null)
password=request.getParameter("password");
if(request.getParameter("email")!=null)
email=request.getParameter("email");
%>
<br>
用户名:<%=username %>
密码:<%=password %>
邮箱:<%=email %>
</body>
</html>