一、相关知识:内置对象使用

客户端的浏览器从Web服务器上获得网页,实际上是使用HTTP协议向服务器发送一个请求,服务器在接收到来自客户端浏览器发来的请求后要响应请求。JSP通过request对象获取客户端浏览器的请求,通过response对客户浏览器进行响应。而session则一直保存着会话期间所需要传递的数据信息。application对象用于保存所有应用程序中的公有数据,服务器启动自动创建,客户所访问网站的各个页面之间浏览时,application对象都是同一个。

wKioL1UA8FSAJ1rYAADLHSpusvc656.jpg

内置对象常用的5个:out、request、application、session、response

他们为隐藏对象,不需要预先声明,就可以在脚本代码,表达式中随意使用

实例1:out输出

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%

out.print("hello<hr/>");
double x=2.45;
out.println("π的值为"+3.1415);
out.println("<br/>"); //换行
out.println(x);       //输出变量

out.write("\r\n");  //换行

%>

说明:out输出流对象,用于输出内容,形成HTML页

实例2:request对象1

request.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
out.print("用户名:"+name+"<br/>");
out.print("密码:"+pwd+"<br/>");

%>

说明:

(1)request封装了由Web浏览器或其他客户端生成的HTTP请求的细节(参数、属性、标头和数据)

(2)上例为request对象从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可以通过HTML表单或网页地址后面提供参数的方法提交数据,然后通过request对象的相关方法来获得这些数据。

(3)request.getParameter("name") 功能是获得name参数的参数值,获得数据的方法可以通过通过HTML表单(后边讲解),第二种通过网页地址后面提供参数的方法提交数据

 

具体:http://localhost:8080/test/request.jsp?name=zhangsan&pwd=12345

实例3:request对象2

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String mstr=request.getParameter("mstr");
String nstr=request.getParameter("nstr");
int m=0,n=0,sum=0;
if(mstr!=null){
m=Integer.parseInt(mstr); 
}
n=Integer.parseInt(nstr);
sum=m+n;
out.print("sum="+sum);
%>

本实例想实现地址栏输入2个数,求和。

正确地址:http://localhost:8080/test/request1.jsp?mstr=123&nstr=456,如果只有mstr=123无nstr参数,上例就会出现nstr参数为null异常,因为空对象是不能执行parseInt方法的。

所以设计过程中应注意判断。

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String mstr=request.getParameter("mstr");
String nstr=request.getParameter("nstr");
int m=0,n=0,sum=0;
if(mstr!=null){
 m=Integer.parseInt(mstr);
 }
if(nstr!=null){
 n=Integer.parseInt(nstr);
 }
if(mstr==null||nstr==null){
 out.print("无mstr和nstr参数值!!");
 }else{
 sum=m+n;
 out.print("sum="+sum);
 }

%>

实例4:数据共享

  • JSP可以通过内置对象的setAttribute、getAttribute方法设置和取得属性,从而实现数据的共享。

  • request对象的setAttribute方法设置数据在request范围存取

  • session对象的setAttribute方法设置数据在session范围存取(会话期间)

  • application对象的setAttribute方法设置数据在application范围存取(服务器启动期间)

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%

String []names={"zhangsan","lisi","wangwu","王六","gogo"};
request.setAttribute("names", names);

%>

<jsp:forward page="request_sub.jsp"/>

 

request_sub.jsp页代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String []names=(String [])request.getAttribute("names");

//遍历输出
for(String s:names)
{
out.println(s);
}
out.print("<br/>");

//数组方式输出
for(int i=0;i<names.length;i++)
{
out.println(names[i]);
}

%>

 

说明:request.getAttribute("names");有效范围是request请求期间

二、用户登录设计

1、登录页面设计login.jsp

<form id="form1" name="form1" method="get" action="dologin.jsp">
  <table width="400" border="1">
    <tr>
      <td>用户名</td>
      <td><input type="text" name="username" id="username" /></td>
    </tr>
    <tr>
      <td>密码</td>
      <td><input type="text" name="password" id="password" /></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input type="submit" name="button" id="button" value="提交" />
      <input type="reset" name="button2" id="button2" value="重置" /></td>
    </tr>
  </table>
</form>

 

2、获取处理登录信息dologin.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<%
 String name = request.getParameter("username");
 String pwd = request.getParameter("password");
 out.println(name + ":" + pwd);
 //if(name.equals("wangxiujuan"))
 if ("wangxiujuan".equals(name)&&"12345".equals(pwd)) {
   out.println("用户名:" + name + "密码" + pwd);
   out.println("<br/>欢迎登录");

    session.setAttribute("name", name);  

//将用户名 name对象保存到session对象内,会话期间有效

//其他网页想获得登录用户名 需要用String name=(String)session.getAttribute("name");

     response.setHeader("refresh", "3;url=index.jsp");
  }
  else {
   out.println("登录失败");

    response.setHeader("refresh", "3;url=login.jsp"); }
 
%>

 3、登录成功后返回首页index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<body>
<%
String name=(String)session.getAttribute("name");
if(name==null)
{
//response.sendRedirect("login.jsp");
out.println("请您先登录");
response.setHeader("refresh", "3;url=login.jsp");
}else{
 %>
<p>hello,<%=name %>
<p align="right"><a href="exit1.jsp">注销</a></p>
<%} %>

</body>

</html>

 

4、注销处理页exit.jsp

<%
session.invalidate();
response.sendRedirect("login.jsp");
%>

三、用户注册设计

1、注册界面register.jsp

 <body>
  <p>用户注册
<hr/>
<form action="doRegister.jsp" method="post">
<table width="400" border="1">
  <tr>
    <td>用户名</td>
    <td><input type="text" name="username" id="username" /></td>
  </tr>
  <tr>
    <td>密码</td>
    <td><input type="text" name="password" id="password" /></td>
  </tr>
  <tr>
    <td>确认密码</td>
    <td><input type="text" name="password1" id="password1" /></td>
  </tr>
  <tr>
    <td>性别</td>
    <td><input name="sex" type="radio"  value="男" checked="checked" />
      男
      <input name="sex  value=" type="radio" value="女" />
      女</td>
  </tr>
  <tr>
    <td>爱好</td>
    <td><input name="aihao" type="checkbox" value="足球" />
      足球
        <input name="aihao" type="checkbox" value="篮球"  />篮球
        <input name="aihao" type="checkbox" value="乒乓球"  />
乒乓球</td>
  </tr>
  <tr>
    <td>邮箱</td>
    <td><input type="text" name="email" /></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="button" id="button" value="提交" />
      <input type="reset" name="button2" id="button2" value="重置" /></td>
  </tr>
</table>

</form>
  </body>

2、处理用户注册信息doRegister.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
 String name = request.getParameter("username");
 String pwd = request.getParameter("password");
 String sex=request.getParameter("sex");
 String email=request.getParameter("email");
 
 String []aihao=request.getParameterValues("aihao");
 
%>
<table width="400" border="1">
  <tr>
    <td>用户名</td>
    <td><%=name %></td>
  </tr>
  <tr>
    <td>密码</td>
    <td><%=pwd%></td>
  </tr>
  <tr>

  <tr>
    <td>性别</td>
    <td><%=sex%></td>
  </tr>
  <tr>
    <td>爱好</td>
    <td>
    <%
    for(String s:aihao)
    out.println(s);
     %>
 </td>
  </tr>
  <tr>
    <td>邮箱</td>
    <td><%=email %></td>
  </tr>
</table>

3、 需要解决问题:

(1)中文乱码:爱好,性别传递的值为汉字,显示为乱码

        解决:在doRegister.jsp获取数据JSP网页的前端(String name = request.getParameter("username");之前)添加request.setCharacterEncoding("utf-8");代码

(2)用户名密码验证问题,将不符合要求信息反馈到注册页显示

    要求:用户名,密码不能为空,用户名、密码4-16位,两次输入密码相同(可以采用Javascript或者jsp实现)

   

(3)如果没有选择爱好异常问题

 决绝代码:

doRegister.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
 request.setCharacterEncoding("utf-8");
 String name = request.getParameter("username");
 String pwd = request.getParameter("password");
 String pwd1 = request.getParameter("password1");
 String sex=request.getParameter("sex");
 
 String email=request.getParameter("email");
 
 String []aihao=request.getParameterValues("aihao");
 String str="";
 if(name==null||pwd==null)
 {
 str=str+"用户名或密码不能为空";
 }else if(pwd.length()<4||pwd.length()>16){
 str=str+"密码长度不在4-16位之间";
 }else if(name.length()<4||name.length()>16){
 str=str+"用户名 长度不在4-16位之间";
 }
 if(!pwd.equals(pwd1))
 {
  str=str+"两次密码不同";
 }
 if(email!=null){
 
  if(email.indexOf(
'@')<0){
  str=str+"邮箱不符合要求";
  }
 }
 if(str.length()>1)
 {
 request.setAttribute("msg", str);
 request.getRequestDispatcher("register.jsp").forward(request, response);
 }

 
%>
<table width="400" border="1">
  <tr>
    <td>用户名</td>
    <td><%=name %></td>
  </tr>
  <tr>
    <td>密码</td>
    <td><%=pwd%></td>
  </tr>
  <tr>

  <tr>
    <td>性别</td>
    <td><%=sex%></td>
  </tr>
  <tr>
    <td>爱好</td>
    <td>
     if(aihao.length>0)
    {//防止爱好没有选择异常
    for(String s:aihao){
    out.println(s);
    }
    }

 </td>
  </tr>
  <tr>
    <td>邮箱</td>
    <td><%=email %></td>
  </tr>
</table>

 

register.jsp页body之上添加

 <%String msg=(String)request.getAttribute("msg"); %>

register.jsp表格末尾添加一行

 </tr>
   <tr>
    <td><%=msg %></td>
    <td></td>
  </tr>

 


说明:汉字乱码问题:

(1)地址栏中参数为汉字解决方法(post=get时)

http://www.jb51.net/article/42294.htm

(2)表单提交数据汉字乱码解决方式

  •  String val= new String(request.getParameter("param").getBytes("ISO-8859-1"),"utf-8");

  • request.setCharacterEncoding("utf-8");

参考

http://zhidao.baidu.com/link?url=tKR4zbOZfTX3IHUXZuHoE4KpcbWMTYhVju52rxeiMw1ddK87ZHcDEm8HVgUe2z2k3H12ndm1lYfVt-ntCnP1mq

 

(3)JSP解决地址栏中传递中文字符乱码的问题(测试不成功)

本方法可以:http://www.jb51.net/article/42294.htm