慕课网 java jsp

一.java web简介

目前软件开发领域三大方向:

1、桌面应用程序——QQ,Office
2、Web应用程序——京东,天猫
3、嵌入式应用程序——安卓,iPhone

静态网页与动态网页

静态网页
表现形式:网页中的内容是固定的,不会更新
所需技术:HTML,CSS
动态网页
表现形式:网页中的内容通过程序动态显示,自动更新,学习制作动态网页。
所需技术:HTML,CSS,数据库技术,至少一门高级语言(JAVA,C#,PHP),JavaScript,XML等。主流的动态网页脚本技术(JSP/ASP.NET/PHP)

Java web开发环境:JDK7.0 Tomcat7.0 Myeclipse10


tomcat安装:


1、解压Tomcat安装包到指定目录
2、配置Tomcat环境变量,在系统变量新建变量
变量名:CATALINA_HOME 变量值:Tomcat根目录即解压目录
3、运行bin目录下的startup.bat 不要关闭这个窗口

4、打开浏览器测试 http://localhost:8080


tomcat目录结构

/bin :存放各种平台下启动和停止tomcat的命令文件,如shutdown.bat
/conf:存放tomcat的各种配置文件
/lib:存放tomcat服务器所需的各种JAB文件
/log:存放tomcat的日志文件
/temp:tomcat运行时用于存放临时文件
/webapps:当发布web应用时,默认会将web应用的文件发布到此目录中

/work:tomcat把由jsp生成的servlet防雨此目录下


手工创建Webapp应用的步骤

1.WebApps下创建项目文件夹
2.在文件夹中编写index.jsp
3.在文件夹中创建WEB-INF文件夹
4.WEB-INF文件夹下编写web.xml(也可从examples中复制,保留基本的标签),新建classes和lib文件夹(classes里面是编译生成的字节码文件;lib里面是要用到的jar包。)
5.测试运行,出现乱码,尝试更换一下编码方式


Myeclipse开发java web 程序

一.配置
myeclipse配置jre:window->preferences->java->installed jre->add->java(jdk的安装目录)
myeclipse集成tomcat:window->preferences->myeclipse->servers->tomcat->选版本->选enable(并     引入tomcat的安装根目录)->在版本下选择jdk

二、MyEclipse Web项目目录结构
1、src:java源程序
2、类库
3、WebRoot:项目根目录
4、xxx.jsp:资源文件

三.修改默认端口号

Tomcat--Conf--server.xml文件,打开,修改8080。


理解web项目虚拟路径

1. web项目虚拟路径默认域项目名字相同;

2. 项目虚拟路径可以修改,在eclipse上修改项目名字,然后重新启动Tomcat服务器,就可以用新虚拟路径名访问了。



二.JSP基础语法

JSP(java server pages[java 服务器端页面])是一种动态网页技术标准


常见动态网站开发技术对比

· JSP:基于java平台,跨平台,安全高,适于【大型】、【企业级】、【分布式】Web应用程序
· Asp.net:.Net平台,简单易学,但安全性差,跨平台性差

· Php:简单,高效,成本低,开发周期短,适合中小型企业web应用开发(LAMP:Linux系统 + Apache服务器 + MySQL数据库 + PHP语言)


jsp指令

page指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令;
include指令:将一个外部文件嵌入到jsp文件中,同时解析这个页面的jsp语句;
taglib指令:使用标签库定义新的自定义标签,在jsp页面中启用定制行为。

page指令:<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>  
HTML注释:<!-- 注释-->  // 在客户端查看源代码时可见
JSP注释:<%--注释--%>    // 在客户端查看源代码时不可见
JSP脚本://      /* */    // 在JSP页面中执行的java代码,注释客户端不可见
声明:<%!代码%>

表达式:<%=代码%


JSP生命周期

第一次访问,JSP文件转换为Servlet(在tomcat主目录下work中可以找到),并执行jspInit(),它只执行一次。jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。
以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但是也要注意多线程的编程带来的同步问题,由于Servlet始终驻于内存,所以响应式非常快的。

若JSP页面有改动的话,在Tomcat中会重新编译生成新的字节码文件

生成九九乘法表

 <body>  
	<%!  
	String fun1()  //表达式调用
	{
		String str="";
		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
			{
				str +=i+"+"+j+"="+(i+j)+"    ";
			}
			str+="<br>";
		}
		return str;
	} 
	
	void fun2(JspWriter out) throws IOException  //jsp脚本方式
	{
		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
			{
				out.println(i+"+"+j+"="+(i+j)+"    ");
			}
			out.println("<br>");
		}
	} 
	%>
	<h1>九九乘法表</h1>	
	<hr>
	<%=fun1() %>
	<hr>
	<% fun2(out); %>

三.JSP内置对象

web容器中已经有的内置对象,不需要使用new来创建,可以直接使用。
常用的五个:out ,request ,response ,session ,application
另外四个:Page, pageContext ,exception ,config

JSP请求与响应模式

用户给服务器发送请求(request),服务器给用户相应(response)

out对象

out对象是 JspWriter类 的实例,是向客户端输出内容常用的对象。

常用方法:

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() 关闭输出流
 <body>
   <% 
   	out.println("<h2>静夜思</h2><br>");
	out.println("窗前明月光 <br>");
	out.println("疑是地上霜 <br>");
	out.flush();
	//out.clear();  //在flush之后调用会抛出异常
	out.clearBuffer(); //在flush之后调用不会抛出异常
	out.println("举头望明月<br>");
	out.println("低头思故乡 <br>");
    %>
       缓冲区大小:<%=out.getBufferSize() %><br>
       缓冲区剩余大小: <%=out.getRemaining()  %><br>
       是否自动清空缓冲区: <%=out.isAutoFlush() %><br>
  </body>

get和post方法的区别。

get:明文形式传送,在url中可以看到,适合小数据 安全性低<br>
post:数据放在htmlheader内,适合大数据 安全性高。

login.jsp

 <body>
  <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 colspan="2"><input   type="submit"   value="提交"> </td>
   	</tr>
   </table>
   </form>
  </body>

dologin.jsp

<body>
    登陆成功! <br>
  </body>

request对象

客户端的请求信息被封装在request对象中,通过它才能了解到用户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。

常用方法如下:

String getParameter(String name) 返回name指定参数的参数值
String[] getParameterValues(String name) 返回包含参数name的所有值的数组
void setAttribute(String, Object) 存储此请中的属性
object getAttribute(String, Object) 返回指定属性的属性值
String getContentType() 得到请求体的MIME类型
String getProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求的服务器主机名


request.setCharacterEncoding("utf-8"); //解决接收post中文数据乱码问题,但解决不了URL的中文乱码问题。
可以在tomcat的Sever.xml文档中做配置修改
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />

request.jsp

  <body>
    <h1>request内置对象</h1>
    <%
    	request.setCharacterEncoding("utf-8"); //解决中文乱码,但解决不了链接传中文参数乱码,需要修改配置文件server.xml
    	request.setAttribute("password","123456");
     %>
     用户名:<%=request.getParameter("username") %><br>
     爱好:<%
     	if(request.getParameterValues("favorite")!=null)
     	{
     		String []favorites=request.getParameterValues("favorite");     	
	     	for(int i=0;i<favorites.length;i++)
	     	{
	     		out.println(favorites[i]+"  ");
	     	}
	    }
	    %>
   密码:<%=request.getAttribute("password") %>;<br>
  请求体的MIME类型:<%=request.getContentType() %>;<br>   //application/x-www-form-urlencoded;
  协议类型及版本号:<%=request.getProtocol() %>;<br>    //HTTP/1.1;
  服务器主机名:<%=request.getServerName() %>;<br>      //localhost;
  服务器端口号:<%=request.getServerPort() %>;<br>      
  请求文件的长度:<%=request.getContentLength() %>;<br>   
  请求客户端的IP地址:<%=request.getRemoteAddr() %>;<br>   //127.0.0.1;
  请求的真实路径:<%=request.getRealPath("request.jsp") %>;<br>   //D:\Program Files\apache-tomcat-6.0.44\webapps\webtest2\request.jsp;
  请求的上下文路径:<%=request.getContextPath() %>;<br>	    ///webtest2;
 </body>
reg.jsp
 <body>
    <h1>用户注册</h1>
  <hr>
  <form name="regForm" action="request.jsp"  method="get">
   <table>
   	<tr>
   		<td>用户名:</td>
   		<td><input type="text" name="username"/></td>
   	</tr>
 
    <tr>
    	<td>爱好:</td>    
    	<td><input type="checkbox" name="favorite" value="read"/>读书
    		<input type="checkbox" name="favorite" value="english"/>英语
    		<input type="checkbox" name="favorite" value="internet"/>上网
    		<input type="checkbox" name="favorite" value="game"/>游戏
    	</td>
   	</tr>
   	<tr>
   		<td colspan="2"><input   type="submit"   value="提交"> </td>
   	</tr>
   </table>  
   </form>
   <br>
    <a href="request.jsp?username=丝丝 ">测试URl传参数</a>
  </body>

response对象

response是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。

常用方法:

String setCharacterEncoding(); //设置响应字符编码格式
String getCharacterEncoding(); //获取响应字符编码格式
void setContentType(); //设置相应MIME类型
PrintWrite对象总是提前于内置的JspWrite对象,也就是out对象
sendRedirect(java.lang.String location) //重定向客户端的请求
注:重定向之前,不能够有out.close()或者out.flush()操作,否则会抛出异常

response.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.PrintWriter"%>
<%
	response.setContentType("text/html;charset=utf-8");//设置相应的MIME类型
	out.println("<h1>response内置对象 </h1>");
	out.println();
	//out.flush();  //若无此句,则先输出printwriter对象
	
	PrintWriter outer=response.getWriter(); //获得输出流对象
	outer.println("大家好,printwriter的outer");
	response.sendRedirect("reg.jsp"); //请求重定向	
%>

请求重定向与请求转发的区别

请求重定向是客户端需要实现的行为,请求转发是服务器自发的行为;
请求重定向是两次请求,既然是两次请求,前一次的请求对象包含的信息不回保存,请求转发是一次请求,请求对象包含的信息是会保存的;
请求重定向的URL地址栏会改变,因为是客户端经过了两次请求,到了最终地址,请求转发的URL地址不会改变,因为客户端只经过了一次请求,接下来的请求和回复都由服务器执行了,客户端自始至终都是在第一次请求的页面中;
请求重定向:response.sendRedirect("xxx.jsp"); ,请求转发:request.getRequestDispatcher("xxx.jsp").forword(request,response);

测试:

reg.jsp
<form name="regForm" action="request.jsp"  method="get">
修改为:<form name="regForm" action="response.jsp"  method="post">

response.jsp

//response.sendRedirect("request.jsp"); //请求重定向,执行reg.jsp后,地址跳转到requeset.jsp,且没有保存前一次信息
request.getRequestDispatcher("request.jsp").forward(request,response);,// 执行reg.jsp后,地址跳转到response.jsp,且保存前一次信息

session
session表示客户端与服务器之间的一次对话
在服务器内存中,每个用户对应一个session,不同用户对应不同session,session对象一一对应


session对象

2.在第一个JSP页面被加载时自动创建,完成会话期管理
3.从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
4.当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种方法知道这是一个客户,就需要session对象。
5.session对象是HttpSession类的实例
6.session的生命周期是从用户开始访问到关闭所有关于session的浏览界面与服务器断开连接的这段时间。
7.session一般有时间限制,长时间不操作可能会导致session失效。session失效后原session中保存的属性值会全部丢失。

常用方法:

long getCreationTime():返回SESSION创建时间
public String getId():返回SESSION创建时JSP引擎为它设的唯一ID号
public Object setAttribute(String name, Object value):使用指定名称将对象绑定到此会话
public Object getAttribute(String name):返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null
String[] getValueNames():返回一个包含此SESSION种所有可用属性的数组

int getMaxInactiveInterval():返回两次请求间隔多长时间此SESSION被取消(单位秒)


session1.jsp 

<body>
    <h1>session内置对象</h1>
    <%
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date(session.getCreationTime());
    session.setAttribute("username","admin");
    session.setAttribute("password","123456");
    session.setAttribute("age","20");
    
    //设置最大生存期限单位s 
    session.setMaxInactiveInterval(10);
    %>
         创建时间:<%=session.getCreationTime() %><br>  <%--毫秒--%>
    		 <%=sdf.format(date) %><br>
    ID号:<%=session.getId() %><br>
          获取用户名属性:<%=session.getAttribute("username") %><br>
    <a href="session2.jsp">跳转到session2.jsp</a>   <%--session未结束 --%>
 </body>

session2.jsp

  <body>
    <h1>session内置对象</h1>    
    ID号:<%=session.getId() %><br>
           获取用户名属性:<%=session.getAttribute("username") %><br>
           保存的属性有:<%String[] names=session.getValueNames();
 				for(int i=0;i<names.length;i++)
 					out.println(names[i]+"  ");
   	  %>
  </body>




session的生命周期

 session活动:

1.某次会话当中通过超链接打开的新页面属于同一次会话
2.只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同意项目资源时属于同一次会话。
3.除非本次会话的所有页面都关闭后再重新访问某个新的jsp或者servlet将会创建新的会话。
注意事项:
注意原有的会话还存在,只是这个旧的sessionId仍然存在于服务器端,只不过再也没有客户端会携带它然后交予服务器端校验


session销毁的三种方式:

1:调用session.invalidate()方法
2:session过期(超时)
3;服务器重新启动

设置session超时的两种方式:

tomcat默认session超时时间为30分钟
1:session.setMaxInactiveInterval(时间);//单位是秒
2:在web.xml配置
<session-config>
<session-timeout>
10
<session-timeout>
<session-config> //单位是分钟



JSP内置对象Application:

1、Application对象实现了用户间数据的共享,可存放全局变量;
2、Application开始于服务器的启动,终止于服务器的关闭;
3、在用户的前后连接或不同用户之间的连接中,可以对Application对象的同一属性进行操作;
4、在任何地方对Application对象属性的操作,都将影响其他用户对此的访问;
5、Application对象是ServletContext类的实例;

JSP内置对象-application常用方法:

(1)public void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话(为此会话添加application对象属性)
(2)public Object getAttribute(String name) 返回此次会话中指定名称的对象。如果没有对象绑定在该名称,则返回null
(3)Enumeration getAttributeNames() 返回所有可用属性名的枚举
  <body>
    <h1>application内置对象</h1>    
    <%
    	application.setAttribute("city","北京");
    	application.setAttribute("postcode","10000");
    	application.setAttribute("email","lisi@126.com");
     %>
     所在城市:<%application.getAttribute("city") ;%><br>
  application中的属性:  <%
     	Enumeration er=application.getAttributeNames(); 
     	while(er.hasMoreElements())
     	{
     		out.println(er.nextElement()+"  ");
     	}%>
    版本号: <%=application.getServerInfo() %>
 </body>




JSP内置对象-page:

(1)JSP对象是java.lang.Object类的实例。
(2)page对象指向当前JSP页面本身,有点类似this指针。
--------------------

page对象常用方法:

(1)class getClass() 返回此对象的类
(2)int hashCode() 返回次对象的hash码
(3)boolean equals(Object obj) 判断此对象是否与指定object对象相等
(4)void copy(Object obj) 把此对象拷贝到指定的object对象中
(5)Object clone() 克隆此对象
(6)String toString() 把此对象转换成String类的对象
(7)void wait() 使一个线程处于等待状态直到被唤醒
(8)void wait(int timeout) 使一个线程处于等待状态直到timeout结束或者被唤醒
(9)void notify() 唤醒一个等待的线程
(10)void notifyAll() 唤醒所有等待的线程
(8)void motifyAll()


JSP内置对象 - pageContext

(1)pageContext对象提供了对JSP页面中所有对象及名字空间的访问操作
(2)pageContext对象可以访问本页面的session,可以访问本页面的application对象的任意属性值
(3)pageContext对象是某个页面中所有功能的集大成者

pageContext对象的常用方法:

(1)JspWriter getOut() 返回当前客户端相应被使用的JspWriter流(out)
(2)HttpSession getSession() 返回当前页面中HttpSession对象(session)
(3)Object getPage() 返回当前页面的Object对象(page)
(4)ServletRequest getRequest() 返回当前面的ServletRequest对象(request)
(5)servletResponse getResponse() 返回当前页的ServletResponse对象(response)
(6)void setAttribute(Strign name, Object attribute) 设置属性及属性值
(7)Object getAttribute(String name ,int scope) 在指定范围内取属性值
(8)int getAttributeScope(String name) 返回某属性的作用范围
(9)void forward(String relativeUrlPath) 使当前页面跳转到另外一个页面(服务器转发)
(10)void include(String relativeUrlPath) 在当前位置包含另一个文件


Config对象

config对象是一个Servlet超初始化是,Jsp引擎向他传递信息用的,Servlet初始化是所要用到的参数
(通常属性名和属性构成)以及服务器有关的信息(通常传递一个ServletContext对象),常用方法如下
ServletContext getServletContext()返回一个含有服务器有关Servlet有关信息的ServletContext对象
String getInitParameter(String name)返回初始化参数的值
Enumeration getInitParameterNames()返回Servlet初始化所需要参数的枚举


内置对象exception

产生异常的页面page语句加上errorPage="指向的异常处理页面";
处理异常的页面page语句加上isErrorPage="true"来接收异常;
常用方法:
(1)String getMessage()返回异常消息;
(2)String toString()返回异常的字符串描述;
(3)void printStackTrace()显示异常及其栈轨迹
(4)Throwable FillinStackTrace()重写异常的执行栈轨迹



阶段案例:做一个简单的登录页面的后台

login.jsp

<span style="color: rgb(20, 25, 30); font-family: 'Microsoft Yahei', 'Hiragino Sans GB', Helvetica, 'Helvetica Neue', 微软雅黑, Tahoma, Arial, sans-serif; line-height: 28px; font-size: 14px;"> </span><body>
  <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 colspan="2"><input   type="submit"   value="登陆"> </td>
   	</tr>
   </table>
   </form>
  </body>

dologin.jsp

 <body>
  <h1>登陆页面</h1>
    <% 
    	String username="";
    	String password="";
    	username=request.getParameter("username");
    	password=request.getParameter("password");    	
    	request.setCharacterEncoding("utf-8");
	    if(username.equals("admin") && password.equals("admin"))
	    {
	    	session.setAttribute("loginuser",username);
	    	request.getRequestDispatcher("login_success.jsp").forward(request,response);
	    }
	    else
	        response.sendRedirect("login_fail.jsp");
   %>
  </body>

login_success.jsp

<span style="font-family:Microsoft Yahei, Hiragino Sans GB, Helvetica, Helvetica Neue, 微软雅黑, Tahoma, Arial, sans-serif;color:#14191e;"><span style="font-size: 14px; line-height: 28px;"> </span></span> <body>
  <h1>登陆成功!</h1>  
  欢迎<%=session.getAttribute("loginuser") %> 
  </body>

login_fail.jsp

  <body>
  <h1>登陆失败!</h1>    
   	<a href="login.jsp">返回登录页面</a>  
  </body>

1.page指当前页面有效。在一个jsp页面里有效


2.request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。


3.Session是用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法)。存放在HttpSession对象中 


4.application是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用 


总结:当数据只需要在下一个forward有用时,用request就够了;
若数据不只是在下一个forward有用时,就用session。
上下文,环境信息之类的,用application。


四.javabeans

javabean是一个特定的java类,使用它的好处就是解决代码的重复编写,减少代码冗余,功能区分明确,提高代码的维护性!

JavaBean设计原则

1.公有类
2.无参的构造方法
3.属性私有
4.getter和setter方法


javabean - JSP动作元素

(1)JSP动作元素为请求处理阶段提供信息。
(2)动作元素遵循XML元素的语法。有一个包含元素名的开始标签,可以有属性、可选内容,以及结束标签。
------------------------------------

JSP动作分为以下几类:

(1)与存取JavaBean有关的6个元素。 如:
<jsp:useBean> <jsp:setProperty> <jsp:getProperty>
(2)6个动作元素。 如:
<jsp:include> <jsp:forward> <jsp:param> <jsp:plugin> <jsp:params> <jsp:fallback>
(3)与Document有关的6个元素:
<jsp:root> <jsp:declaration> <jsp:scriptlet> <jsp:expression> <jsp:text> <jsp:output>
(4)用来动态生成XML元素标签的3个动作:
<jsp:attribute> <jsp:body> <jsp:element>
(5)用在Tag File中的2个元素:
<jsp:invoke> <jsp:dobody>


<jsp:useBeans>

在jsp页面中实例化或在指定范围内使用Javabean
<jsp:useBean id="标识符" class="java类名" scope="作用范围"/>

User.java

package com.po;
//公有类
public class User {
//私有属性
private String username;
private String password;

//无参构造函数
public void User()
{

}
//setter/getter
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;
}
}

userTest.jsp

<body>
  <h1>用户</h1>
  <hr>
  <%
  User user=new User();
  user.setUsername("admin");
  user.setPassword("123456");
  %>
  用户名:<%=user.getUsername()%>
  密码:<%=user.getPassword() %>
  </body>


<jsp:setProperty>

动作:给【已经实例化的Javabean对象的属性赋值】,一共有四种形式。
1、需要表单提交属性:<jsp:setProperty name="Javabean实例名" property="*"/>: 与之前页面提交的表单的【所有属性进行匹配】,若有与javabean类属性名相同的,则进行赋值。比如表坛提交了username="xxx",而javabean里有username属性,则对其进行赋值
2、需要表单提交属性<jsp:setPropery name="Javabean实例名" property="javabean属性名" />:对【指定的属性进行匹配】
3、手动设置属性:<jsp:setProperty name = "Javabean实例名" property="Javabean属性名" value="BeanValue" />
4、与request参数有关,通过url传参 :<jsp:setProperty name="Javabean实例名" property="propertyName" param="request对象中的参数名" />

1.根据表单自动匹配所有的属性
<jsp:setProperty name="myUsers" property="*"/>
2.根据表单自动匹配相应的属性(部分匹配)
<jsp:setProperty name="myUsers" property="username"/>
3.与表单无关,通过手工赋值给属性
<jsp:setProperty name="myUsers" property="username" value="Lisa"/>
4.通过url传参数给属性赋值(表单中action属性url传递参数值:action="dologin.jsp?mypass=999999")
<jsp:useBean id="myusers" class="com.po.User"  scope="page" />     
<jsp:setProperty name="myusers" property="username"  param="mypass"  />


<jsp:getProperty>

获取指定属性的值
<jsp:getProperty name="javabean实例名" property="属性名"></jsp:getProperty>


javabean的作用域范围 - scope

使用useBeans的scope属性可以用来指定javabean的作用范围:
scope="page" 仅在当前页面有效(重定向或者服务器内部转发均后均无效)
scope="request" 可用request.getAttribute()方法获得javabean对象。在当前请求及服务器转发后的请求中有效。
scope="session" 可用session.getAttribute()方法获得javabean对象。在当前会话session有效期间,该对象均有效。
scope="application" 可用application.getAttribute()方法获得javabean对象。范围最广
-- 作用域范围从小到大依次为:page < request < session < application.


Model1分为三层:

1.界面层:由JSP页面进行与客户端浏览器的交互,可以直接调用JavaBeans
2.业务逻辑层:由JavaBeans进行处理业务逻辑,封装数据,并与数据库层进行交互
3.数据库层:底层数据库,可被javaBeans访问

避免了JSP页面直接进行业务逻辑处理所带来的维护性,扩展性差的弱点.体现了分层设计的思想

阶段案例   javabeans  登陆

业务逻辑层userDao,java

package com.po.Dao;
import com.po.User;;
//公有类
public class UserDao {
	public boolean isLoginRight(User u)
	{
		if(  "admin".equals(u.getUsername()) && "admin".equals(u.getPassword()) )
			return true;
		else
			return false;
	}
}
</pre><h3>dologin.jsp</h3><p></p><pre name="code" class="html"><body> 
  <h1>%登录页面</h1>
  <hr>
    <jsp:useBean id="myusers" class="com.po.User"  scope="page" />  
    <jsp:useBean id="myusersDao" class="com.po.Dao.UserDao"  scope="page" />  
    <jsp:setProperty name="myusers" property="*" />  
    
    <% if(myusersDao.isLoginRight(myusers))
    {
    	session.setAttribute("loginuser",myusers.getUsername());
    	request.getRequestDispatcher("login_success.jsp").forward(request,response);
    }
    else
        response.sendRedirect("login_fail.jsp");
    %>
   </body>


五.Cokkie

http协议的无状态性

无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。
简单地说,就是服务器不会去记得你,所以就是无状态协议。


解决HTTP无状态有两种常用方法:

1、Session;
2、Cookie;


cookie的作用

1.对特定对象的追踪
2.保存用户网页浏览记录与习惯
3.简化登陆
安全风险:容易泄漏用户信息


Cookie创建与使用

创建 Cookie newCookie = new Cookie(String key,Object value);
写入 response.addCookie(newCookie);
读取 Cookie[] cookies = request.getCookies();
设置有效期 setMaxAge()
创建后赋值 setValue()
获取名称 getName()
获取值 getValue()
获取有效期 getMaxAge()


项目案例  保存用户名密码cookie

login.jsp

  <body>
  <h1>用户登陆</h1>
  <hr>  
    <%
	String username="";
	String password=""; 
	Cookie[] cookies=request.getCookies();
	if(cookies!=null && cookies.length>0)
	{
		for(Cookie c:cookies)
		{
			if("username".equals(c.getName()))
			{
				username=URLDecoder.decode(c.getValue(),"utf-8");
			}
			if("password".equals(c.getName()))
			{
				password=URLDecoder.decode(c.getValue(),"utf-8");
			}
		}
	}
   %>
  <form  name="loginForm" action="dologin.jsp" 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="登陆"> <input   type="reset"   value="取消"> </td>
   	</tr>
   </table>
   </form>
  </body>

dologin.jsp

  <h1>登陆成功</h1>
  <hr>
   <% 
   request.setCharacterEncoding("utf-8");
   String[] isUserCookies=request.getParameterValues("isUseCookie");
   if(isUserCookies!=null && isUserCookies.length>0)
   {
      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(84800);//设置有效期
      passwordCookie.setMaxAge(84800);
      response.addCookie(usernameCookie);//写入
      response.addCookie(passwordCookie);
   }
   else
   {
   		Cookie[] cookies=request.getCookies();
   		if(cookies!=null && cookies.length>0)
   		{
	   		for(Cookie c:cookies)
	   		{
	   			if("username".equals(c.getName()) || "password".equals(c.getName()) )
	   			{
	   				c.setMaxAge(0);  //设置失效
	   				response.addCookie(c); //重新保存
	   			}
	   		}
	   	}
   }
  
   %>

  <a href="userinfo.jsp" >查看用户信息</a>

  </body>

userinfo.jsp

  <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("username".equals(c.getName()))
			{
				username=URLDecoder.decode(c.getValue(),"utf-8");
			}
			if("password".equals(c.getName()))
			{
				password=URLDecoder.decode(c.getValue(),"utf-8");
			}
		}
	}
  %>
  
  	用户名:<%=username %>
  	密码:<%=password %>
  </body>



Session与Cookie的对比:

1、Session保存在服务器端,Cookie保存在客户端;
2、Session保存的是Object类型,Cookie保存的是String类型;
3、Session随会话的结束将其存储的数据销毁,Cookie可以长期保存在客户端;
4、Session保存重要信息,Cookie保存不重要信息;

JSP指令与动作元素

include指令 

<%@ include file="url" %>


include动作(动作标签)

<jsp:include page="URL" flush="true/false" />
page 要包含的页面
flush 被包含的页面是否从缓冲区读取



forward动作

<jsp:forward page = "URL" >
等同于
request.getRequestDispatcher("/url").forward(request,response);  服务器内部转发

param动作语法:<br>

<jsp:param name="参数名" values="参数值"><br>
常与<jsp:forward> 一起使用,作为其的子标签,用于传递新参数或者修改原有参数值,修改参数时使用form表单里的参数名称即可。同样用request.getParameter("参数名")获取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值