【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统

MVC不是一种像C、JAVA的编程语言,也不是一种像Ajax,Servlet的技术,只是一种如同面向对象一样编程思想。近年来MVC一直很火,赞者批者有之,然后大篇幅的文章很多,可是简明扼要的简单MVC的例子几乎没有。在JSP领域一直向鼓风机地猛吹SSH如何如何地好,一直怒批JSP,Servlet等如何如何差。其实使用JSP+Servlet同样可以利用MVC思想来完成一个系统。下面用一个烂得不能再烂的例子,你步入网页编程必须学会的东西,登陆、注册、修改密码系统,来说明这种编程思想。

一、基本目标

在一个form.jsp页面有三个表单,分别是登陆系统、注册系统、修改密码系统,不同情况给出不同的信息,如下图:

处理Servlet,也就是那些Java文件,是不可以通过直接输入网址来访问的。

二、基本思想

网站目录结构如下图所示,输入表单的页面form.jsp就是所谓的View层,单击go!之后提交到的处理Java文件登陆系统的login.java,注册系统的register.java,修改密码系统的update.java里面不允许有任何操作数据库的动作,它们只能通过form.jsp发送过来的信息,构造相应的sql语句到dbDAO.java,在dbDAO.java同一操作数据库,这些java文件就是所谓的Controller层,然后dbDAO.java就是所谓的处于JavaBean,Java容器下的DAO组件,什么业务逻辑的狗屁抽象东西了,也就是Model层了。

MVC的编程思想,在一开始写程序是最蛋疼的,其在最初始的开发速度不如直接写出Java语句操作数据库,你所想即所得当然写得比起你又要把操作数据库的东西抽象出来放在一个dbDAO.java里面快,但是在你开发完一个登陆系统之后,随后的用户注册系统、修改密码系统很快就能够完成了,因为所有的东西都被你抽象好了,改起来非常好改。这就是现在一些企业严格要求MVC去编程的原因,首先第一个分工明确,第二个是以后改起来好改,最重要的是他们可以利用一些技术不让你看到dbDAO.java,你只管开发View层或者Controller就能不完全掌握它们底层的数据库是什么。甚至一些专门写Model的程序员,他们根本就不知道数据库里面的一堆数据用来干什么。只有核心高管才知道整个程序的流程。他管你程序难写不好写,不会写请滚粗。

MVC编程思想有好有不好,这里不再讨论,关键是你要会。这是一道从低级程序猿进阶到中级程序猿的坎。下面使用Servlet说明一下怎么同时实现这三个系统的。不采用复杂SSH搞得一头雾水了。

这东西真的不难,请不要给那些大篇幅的东西吓到,只是我此前讨论过的JDBC技术《【Mysql】Java中对Mysql数据库的增删改查、Java的System类》(点击打开链接)与Servlet技术《【Servlet】最简单的Servlet JavaWeb程序》(点击打开链接)的指示再现而已。

三、制作过程

1、首先还是有一个test数据库,里面有一张用户信息表usertable,还是如下图经典的配置,主键、用户名、密码,

在表里面已经存在几个用户信息,如下图,按理说,这里的密码应该通过SHA-1的编码再存放的,但是为了避免太复杂,这里先用明文存放:

2、新建一个eclipse工程,在lib文件夹,放入javax.servlet-api-3.1.0.jar,防止一些来路不明的Tomcat不支持Servlet,这东西超过3.0就可以,还有所谓的mysqlJDBC数据源mysql-connector-java-5.1.32.jar,这东西超过5.0即可。就两个Jar包,网上一大堆,摆入lib文件夹就完事。

3、配置好Servlet,在web.xml文件写入如下的代码,表示/login的域名就跳到根目录下的login.java处理,其余如此类推。

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     version="2.5">  
  6. <!-- 用户登录 -->  
  7.     <servlet>  
  8.         <servlet-name>login</servlet-name>  
  9.         <servlet-class>login</servlet-class>  
  10.     </servlet>  
  11.     <servlet-mapping>  
  12.         <servlet-name>login</servlet-name>  
  13.         <url-pattern>/login</url-pattern>  
  14.     </servlet-mapping>  
  15. <!-- 用户注册 -->   
  16.     <servlet>  
  17.         <servlet-name>register</servlet-name>  
  18.         <servlet-class>register</servlet-class>  
  19.     </servlet>  
  20.     <servlet-mapping>  
  21.         <servlet-name>register</servlet-name>  
  22.         <url-pattern>/register</url-pattern>  
  23.     </servlet-mapping>  
  24. <!-- 用户修改密码 -->     
  25.     <servlet>  
  26.         <servlet-name>update</servlet-name>  
  27.         <servlet-class>update</servlet-class>  
  28.     </servlet>  
  29.     <servlet-mapping>  
  30.         <servlet-name>update</servlet-name>  
  31.         <url-pattern>/update</url-pattern>  
  32.     </servlet-mapping>  
  33. </web-app>  

4、之后MVC先写哪个都没有关系,我习惯先写V,因为V最简单,就一个表示层,不用怎么思考,然后用户会产生什么变量你写完V就能够明确。也就是那个form.jsp,里面实际上就三张简单得不能再简单的表单了。放一段jsp语句,检查是否存在提示信息,如果有则输出。

[html] view plain copy

  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  7. <title>login</title>  
  8. </head>  
  9. <body>  
  10.     <div style="color: red;">  
  11.         <strong>   
  12.             <%  
  13.             if(request.getAttribute("errmsg")!=null){  
  14.                 out.println(request.getAttribute("errmsg"));  
  15.             }  
  16.             %>  
  17.         </strong>  
  18.     </div>  
  19.     用户登录:<br />  
  20.     <form method="post" action="login">  
  21.         username:<input type="text" name="username" /><br />  
  22.         password:<input  type="password" name="password" /><br />  
  23.         <input type="submit" value="go!" /><br />  
  24.     </form>  
  25.     用户注册:<br />  
  26.     <form method="post" action="register">  
  27.         username:<input type="text" name="username" /><br />  
  28.         password:<input  type="password" name="password" /><br />  
  29.         passwordAgain:<input type="password" name="passwordAgain" /><br />  
  30.         <input type="submit" value="go!" /><br />  
  31.     </form>  
  32.     修改密码:<br />  
  33.     <form method="post" action="update">  
  34.         username:<input type="text" name="username" /><br />  
  35.         password:<input  type="password" name="password" /><br />  
  36.         newpassword:<input type="password" name="newpassword" /><br />  
  37.         newpasswordAgain:<input  type="password" name="newpasswordAgain" /><br />  
  38.         <input type="submit" value="go!" /><br />  
  39.     </form>  
  40. </body>  
  41. </html>  

按理说,这段jsp也应该省去,使得V层是纯粹的V层,全部都是前端代码,应该直接利用ajax技术去完成错误信息的输出,使用Dwr或者jqueryAjax什么的javascript前端技术,这里为了不搞太复杂,还是用回简单的jsp代码来说明,同时验证两次密码是否一致,也应该用去《【JavaScript】表单即时验证,不成功不让提交》(点击打开链接)做的,但是,同样为了简单一点,放到C层去处理吧。理解了MVC思想之后,大家慢慢改。

5、再写M,操作数据库的动作抽象出来,把连接数据库的动作放在构造函数,把关闭数据库的动作放在析构函数,以后在C层连con.close也省了,别告诉我Java没有析构函数,protected void finalize()与严格意义上的析构函数,得到的实际结果是没有任何区别,只有概念上的繁琐区别,然后比如查询、插入、修改数据,一般不用写删除,因为习惯设置标志位伪删除。关闭数据的时候,先看看是否现在是连接数据库的。

这个所谓的持久层,一般写好就不用改了。你只需要不停写C去调用M层,返回结果给V层。

[java] view plain copy

  1. import java.sql.*;  
  2.   
  3. public class dbDAO {  
  4.     private Connection con;  
  5.   
  6.     // 构造函数,连接数据库  
  7.     public dbDAO() throws Exception {  
  8.         String dburl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";  
  9.         String dbusername = "root";  
  10.         String dbpassword = "root";  
  11.         Class.forName("com.mysql.jdbc.Driver");  
  12.         this.con = DriverManager.getConnection(dburl, dbusername, dbpassword);  
  13.     }  
  14.   
  15.     // 执行查询  
  16.     public ResultSet query(String sql, Object... args) throws Exception {  
  17.         PreparedStatement ps = con.prepareStatement(sql);  
  18.         for (int i = 0; i < args.length; i++) {  
  19.             ps.setObject(i + 1, args[i]);  
  20.         }  
  21.         return ps.executeQuery();  
  22.     }  
  23.   
  24.     // 执行插入  
  25.     public boolean insert(String sql, Object... args) throws Exception {  
  26.         PreparedStatement ps = con.prepareStatement(sql);  
  27.         for (int i = 0; i < args.length; i++) {  
  28.             ps.setObject(i + 1, args[i]);  
  29.         }  
  30.         if (ps.executeUpdate() != 1) {  
  31.             return false;  
  32.         }  
  33.         return true;  
  34.     }  
  35.   
  36.     // 执行修改  
  37.     public boolean modify(String sql, Object... args) throws Exception {  
  38.         PreparedStatement ps = con.prepareStatement(sql);  
  39.         for (int i = 0; i < args.length; i++) {  
  40.             ps.setObject(i + 1, args[i]);  
  41.         }  
  42.         if (ps.executeUpdate() != 1) {  
  43.             return false;  
  44.         }  
  45.         return true;  
  46.     }  
  47.   
  48.     // 析构函数,中断数据库的连接  
  49.     protected void finalize() throws Exception {  
  50.         if (!con.isClosed() || con != null) {  
  51.             con.close();  
  52.         }  
  53.     }  
  54. }  

这里与此前讨论过的JDBC技术《【Mysql】Java中对Mysql数据库的增删改查、Java的System类》(点击打开链接)没有任何区别,只是注意这里新增了一点点的小东西,通过《【Java】JDK1.5以后新型的泛型参数传递方法Object...args》(点击打开链接)传递一个sql语句,与一个Object数组过来,里面有字符串String与整形int,这里是为了配合setObject的方法,比如传递过来的sql语句是:

[sql] view plain copy

  1. update userTable set password=? where username=?  

两个Object参数是字符串11与22,通过:

[java] view plain copy

  1. for (int i = 0; i < args.length; i++) {  
  2.     ps.setObject(i + 1, args[i]);  
  3. }  

它会自动把?替换按顺序替换成你传递过来的Object参数,形成出一条完整的sql语句,供你之后的插入、修改、删除方法executeUpdate()或者查询方法executeQuery()使用:

[java] view plain copy

  1. update userTable set password=‘11‘ where username=’22‘  

如果传递过来的是整形,它也会自动把引号去掉,以构造出一条完整的语句。所谓的PreparedStatement对象也就是这个意思了!

直接强调插入、修改、删除方法与查询方法在JDBC里面是不同的,前者是executeUpdate(),后者是executeQuery(),那是因为前者都是没有返回值,后者有返回值的缘故啊!当然,封装好的asp与php就另当别论。

通过上面的方法,现在不管你传递一个什么的东西过来,都能够查询了。

6、最后写C,这是最难的一步,有了M的基础与V的基础,才能把两部分连接起来。这里的Servlet不能通过一个service方法把doGet与doPost合起来,恰恰是把它们分开防止用户直接输入网址访问此Servlet,因为用户直接输入网址访问此Servlet是调用doGet方法,通过表单直接传递过来的是doPost方法,因为我再表单早就注明了。

(1)首先是login.java,登陆的思想没什么好说的。把此用户名在数据库对应的密码与用户输入的密码比对,是此成功,否此失败,查不到就是失败了。

可以明显看到,这里没有任何操作的数据库的东西。

[java] view plain copy

  1. import java.io.*;  
  2. import java.sql.*;  
  3.   
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6.   
  7. public class login extends HttpServlet {  
  8.     // 防止用户直接输入网址访问此Servlet  
  9.     protected void doGet(HttpServletRequest request,  
  10.             HttpServletResponse response) throws ServletException, IOException {  
  11.         PrintStream out = new PrintStream(response.getOutputStream());  
  12.         response.setContentType("text/html;charSet=utf-8");  
  13.         out.print("请正常打开此页");  
  14.     }  
  15.   
  16.     protected void doPost(HttpServletRequest request,  
  17.             HttpServletResponse response) throws ServletException {  
  18.         String errmsg = "";  
  19.         //获取用户输入的东西  
  20.         String username = request.getParameter("username");  
  21.         String password = request.getParameter("password");  
  22.         try {  
  23.             //构造操作数据库的语句  
  24.             dbDAO db = new dbDAO();           
  25.             ResultSet rs = db  
  26.                     .query("select password from userTable where username=?",  
  27.                             username);  
  28.             //根据不同的查询结果的,返回不同的结果到View层  
  29.             if (rs.next()) {  
  30.                 if (rs.getString("password").equals(password)) {  
  31.                     HttpSession session = request.getSession();  
  32.                     session.setAttribute("username", username);  
  33.                     request.getRequestDispatcher("/welcome.jsp").forward(  
  34.                             request, response);  
  35.                 } else {  
  36.                     errmsg = "密码错误!";  
  37.                     request.setAttribute("errmsg", errmsg);  
  38.                     request.getRequestDispatcher("/form.jsp").forward(request,  
  39.                             response);  
  40.                 }  
  41.             } else {  
  42.                 errmsg = "用户名不存在!";  
  43.                 request.setAttribute("errmsg", errmsg);  
  44.                 request.getRequestDispatcher("/form.jsp").forward(request,  
  45.                         response);  
  46.             }  
  47.         } catch (Exception e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.   
  51.     }  
  52. }  

这里的错误信息仅仅存在request对象,它在Servlet返回结果给form.jsp之后就消息了,以后在任何页面用request.getAttribute("errmsg")都拿不到此次请求的返回的提示消息了。如果登陆成功,则把用户名存放在session对象,这个对象默认是用户不关闭这个浏览器都不会消失的,一直存在的。登陆成功,用户不关闭浏览器,在任何页面利用session.getAttribute("username")都能拿到它的用户名,除非有语句设置这个session的生存时间或者立即死亡。

(2)之后的register.java的开发就快了,你可以比对login.java代码几乎一样,如果不使用MVC则要把操作数据库大改特改,甚至如果你直接写在jsp页面,就像php与asp开发那样,不是自己去改的话很蛋疼的,思想还是那个思想,先比对用户输入的密码是否一致,然后查询是否有这个用户,没有就在数据库插入这条信息。

[java] view plain copy

  1. import java.io.*;  
  2. import java.sql.*;  
  3.   
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6.   
  7. public class register extends HttpServlet {  
  8.     // 防止用户直接输入网址访问此Servlet  
  9.     protected void doGet(HttpServletRequest request,  
  10.             HttpServletResponse response) throws ServletException, IOException {  
  11.         PrintStream out = new PrintStream(response.getOutputStream());  
  12.         response.setContentType("text/html;charSet=utf-8");  
  13.         out.print("请正常打开此页");  
  14.     }  
  15.   
  16.     protected void doPost(HttpServletRequest request,  
  17.             HttpServletResponse response) throws ServletException {  
  18.         String errmsg = "";  
  19.         String username = request.getParameter("username");  
  20.         String password = request.getParameter("password");  
  21.         String passwordAgain = request.getParameter("passwordAgain");  
  22.   
  23.         try {  
  24.             if (password.equals(passwordAgain)) {  
  25.                 dbDAO db = new dbDAO();  
  26.                 ResultSet rs = db.query(  
  27.                         "select username from userTable where username=?",  
  28.                         username);  
  29.                 if (!rs.next()) {  
  30.                     db.insert(  
  31.                             "insert into userTable(username,password) values(?,?)",  
  32.                             username, password);  
  33.                     errmsg = "注册成功!";  
  34.                     request.setAttribute("errmsg", errmsg);  
  35.                     request.getRequestDispatcher("/form.jsp").forward(request,  
  36.                             response);  
  37.                 } else {  
  38.                     errmsg = "用户名已存在!";  
  39.                     request.setAttribute("errmsg", errmsg);  
  40.                     request.getRequestDispatcher("/form.jsp").forward(request,  
  41.                             response);  
  42.                 }  
  43.             } else {  
  44.                 errmsg = "两次输入的密码不一致";  
  45.                 request.setAttribute("errmsg", errmsg);  
  46.                 request.getRequestDispatcher("/form.jsp").forward(request,  
  47.                         response);  
  48.             }  
  49.         } catch (Exception e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.   
  53.     }  
  54. }  

(3)修改密码系统,这个有了上面一大轮的基础,已经易如反掌,你只要改成,看用户两次输入的密码是否一致,再看用户是否能登陆成功,最后修改这个用户名所对应的密码。

[java] view plain copy

  1. import java.io.*;  
  2. import java.sql.*;  
  3.   
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6.   
  7. public class update extends HttpServlet {  
  8.     // 防止用户直接输入网址访问此Servlet  
  9.     protected void doGet(HttpServletRequest request,  
  10.             HttpServletResponse response) throws ServletException, IOException {  
  11.         PrintStream out = new PrintStream(response.getOutputStream());  
  12.         response.setContentType("text/html;charSet=utf-8");  
  13.         out.print("请正常打开此页");  
  14.     }  
  15.   
  16.     protected void doPost(HttpServletRequest request,  
  17.             HttpServletResponse response) throws ServletException {  
  18.         String errmsg = "";  
  19.         String username = request.getParameter("username");  
  20.         String password = request.getParameter("password");  
  21.         try {  
  22.             dbDAO db = new dbDAO();  
  23.             ResultSet rs = db  
  24.                     .query("select password from userTable where username=?",  
  25.                             username);  
  26.             if (rs.next()) {  
  27.                 if (rs.getString("password").equals(password)) {  
  28.                     String newpassword = request.getParameter("newpassword");  
  29.                     String newpasswordAgain = request.getParameter("newpasswordAgain");  
  30.                     if(newpassword.equals(newpasswordAgain)){  
  31.                         db.modify("update userTable set password=? where username=?", newpassword,username);  
  32.                         errmsg = "密码修改成功!";  
  33.                         request.setAttribute("errmsg", errmsg);  
  34.                         request.getRequestDispatcher("/form.jsp").forward(request,  
  35.                                 response);  
  36.                     }  
  37.                     else{  
  38.                         errmsg = "两次输入密码不一致!";  
  39.                         request.setAttribute("errmsg", errmsg);  
  40.                         request.getRequestDispatcher("/form.jsp").forward(request,  
  41.                                 response);  
  42.                     }  
  43.                 } else {  
  44.                     errmsg = "密码错误!";  
  45.                     request.setAttribute("errmsg", errmsg);  
  46.                     request.getRequestDispatcher("/form.jsp").forward(request,  
  47.                             response);  
  48.                 }  
  49.             } else {  
  50.                 errmsg = "用户名不存在!";  
  51.                 request.setAttribute("errmsg", errmsg);  
  52.                 request.getRequestDispatcher("/form.jsp").forward(request,  
  53.                         response);  
  54.             }  
  55.         } catch (Exception e) {  
  56.             e.printStackTrace();  
  57.         }  
  58.   
  59.     }  
  60. }  

四、总结与展望

通过上面的介绍,你可以看到MVC的优点与缺点,这东西的代码比平时多了一倍,还多了分层、建立持久层,也就是dbDAO.java的思考,但是你打好M的基础之后,以后要加新功能,你只要在web.xml加东西,加C层的java,查询数据库的语句统一变成了几个方法query,insert,modify,连接数据库,关闭数据库也不用你做了。与其说是一个新的编程模式,不如是面向对象OO编程的思想进一步深化而已。这要求你对变量的传递更加地熟悉。

时间: 2024-10-31 17:49:16

【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统的相关文章

一个处理用户登陆的servlet简单实例_java

本文实例讲述了一个处理用户登陆的servlet实现方法.分享给大家供大家参考.具体分析如下: Login.java代码如下: 复制代码 代码如下: package com.bai; import javax.servlet.http.*; import java.io.*; public class Login extends HttpServlet{     public void doGet(HttpServletRequest req,HttpServletResponse res){  

jsp+servlet实现最基本的注册登陆功能

源码和数据库下载地址:http://download.csdn.net/detail/biexiansheng/9759722 1:首先需要设计好数据库和数据表,这里简单截图说明我创建的字段和类型. 2:进入正题,开始开发前台和后台代码.首先创建一个动态web工程,然后先创建一个实体类. 1 package com.bie.po; 2 /** 3 * @author BieHongLi 4 * @version 创建时间:2017年2月21日 上午9:59:03 5 * 用户的实体类 6 */

简述MVC思想与PHP如何实现MVC

简述MVC思想与PHP如何实现MVC 我相信已经有很多这样的文章了,但是我今天还是愿意把自己的经验与大家分享一下.纯属原创,我也没什么保留,希望对新手有帮助,有说的不对的地方,也欢迎指出. 什么是MVC? 简单的说就是将网站源码分类.分层. MVC三个字母的含义: M:Model 模型,负责数据库操作. V:View 视图,负责调用Model调取数据,再调用模板,展示出最终效果. C:Controller 控制器,程序的入口,决定改调用哪个View,并告诉View该做什么. 如此说来,程序的执行

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装       (5):前台Jquery easyUI实现   (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一       (9):TT摸版的学

MVC4制作网站教程第二章 用户登陆2.2_实用技巧

一用户  1.1用户注册  1.2用户登陆  首先在Models里添加用户登陆模型类UserLogin,该类只要用用户名,密码和验证码三个字段.  /// <summary> /// 用户登陆模型 /// </summary> public class UserLogin { /// <summary> /// 用户名 /// </summary> [Display(Name = "用户名", Description = "4-

新手学Struts(一)----JSP+Servlet讲解MVC实现原理

MVC基本原理 一个简单的例子 改良的例子 Struts基本流程的实现     最近在学SSH(Struts+ Hibernate+Spring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊~~     现在开始自己也要捣鼓捣鼓这些东西,还是有点小激动哒~~,Struts是基于MVC框架实现的,今天主要讲讲Struts的实现过程. MVC基本原理     MVC框架,相信大家也都已经耳熟蓝(能)翔(详)了! 1.终端接受到用户的请求,

基于jsp+servlet图书管理系统之后台用户信息修改操作

上一篇的博客写的是查询操作,且附有源码和数据库,这篇博客写的是修改操作,附有从头至尾写的代码(详细的注释)和数据库! 此次修改操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732691  为了方便理解和说明,先写一下执行的流程和步奏,详细代码可以下载连接. 1:修改操作的执行流程: 1.1:修改操作需要先获取到用户信息的编号,然后才可以进行修改,脑子里一定有这个思路.故获取用户编号的操作即为查询操作.这里使用了一个小工具进行分页操

Android——用户登陆及用户名和密码的保存

目录 一.Android下的Junit测试 二.登陆记录密码界面设计 三.采用rom保存用户数据 一.Android下的Junit测试 在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 首先建立一个新的Android项目,这里我命名为:junit,然后编写AndroidManifest.xml文件,在里面添加uses-library和instrumen

对设计用户体验持不同观点的看法

用户体验(User Experience,简称UX 或 UE)是一种纯主观的在http://www.aliyun.com/zixun/aggregation/6579.html">用户使用一个产品(服务)的过程中建立起来的心理感受.因为它是纯主观的,就带有一定的不确定因素.个体差异也决定了每个用户的真实体验是无法通过其他途径来完全模拟或再现的.但是对于一个界定明确的用户群体来讲,其用户体验的共性是能够经由良好设计的实验来认识到. 用户体验主要是来自用户和人机界面的交互过程.在早期的软件设计