zoukankan      html  css  js  c++  java
  • 20160402javaweb 开发模式

    开发案例:

     首先,我们确定用xml文件代替数据库,便于测试

    建立web工程,基本架构见下图

    代码如下:

    首先是javabean:User.java

    package com.dzq.domian;
    
    import java.io.Serializable;
    
    import com.dzq.exception.MsgException;
    
    public class User implements Serializable{
    private String username;
    private String password;
    private String password2;
    private String nickname;
    private String email;
    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;
    }
    public String getPassword2() {
        return password2;
    }
    public void setPassword2(String password2) {
        this.password2 = password2;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public User(){
        
    }
    public User(String username, String password, String password2,
            String nickname, String email) {
        
        this.username = username;
        this.password = password;
        this.password2 = password2;
        this.nickname = nickname;
        this.email = email;
    }
    @Override
    public String toString() {
        return username+":"+password;
    }
    public void checkValue() throws MsgException{
        if(username==null||"".equals(username)){
            throw new MsgException("用户名不能为空");
        }
        if(password==null||"".equals(password)){
            throw new MsgException("密码不能为空");
        }
        if(password2==null||"".equals(password2)){
            throw new MsgException("密码不能为空");
        }
        if(!password.equals(password2)){
            throw new MsgException("两次密码输入不一致");
        }
        if(nickname==null||"".equals(nickname)){
            throw new MsgException("昵称不能为空");
        }
        if(email==null||"".equals(email)){
            throw new MsgException("邮箱不能为空");
        }
    }
    
    }

    数据类XmlUserDao.java

    package com.dzq.dao;
    
    
    import java.util.*;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import com.dzq.domian.User;
    import com.dzq.util.XmlDaoUtils;
    
    public class XmlUserDao {
        /**
         * 根据用户名查找用户
         * @param username 用户名
         * @return 根据用户名找到的用户信息,如果没找到,返回null
         */
    public User findUserByUserName(String username){
        Document dom=XmlDaoUtils.getDom();
        Element root=dom.getRootElement();
        List<Element> list=root.selectNodes("//user[@username='"+username+"']");
        if(list.size()>0){
            Element userEle=list.get(0);
            User user=new User();
            user.setUsername(userEle.attributeValue("username"));
            user.setPassword(userEle.attributeValue("password"));
            user.setNickname(userEle.attributeValue("nickname"));
            user.setEmail(userEle.attributeValue("email"));
            return user;
        }else{
            return null;
        }
    }
    /**
     * 添加用户
     * @param user 要添加用户信息的bean
     */
    public void addUser(User user){
        Document dom=XmlDaoUtils.getDom();
        Element root=dom.getRootElement();
        
        Element userEle=DocumentHelper.createElement("user");
        userEle.setAttributeValue("username", user.getUsername());
        userEle.setAttributeValue("password", user.getPassword());
        userEle.setAttributeValue("nickname", user.getNickname());
        userEle.setAttributeValue("email", user.getEmail());
        root.add(userEle);
        XmlDaoUtils.refXml();
    }
    
    /**
     * 根据用户名密码查找用户信息
     * @param username 用户名
     * @param password 密码
     * @return 找到的用户,找不到返回null 
     */
    public User findUserByUNAndPWD(String username,String password){
        
        Document dom=XmlDaoUtils.getDom();
        Element root=dom.getRootElement();
        List<Element> list=root.selectNodes("//user[@username='"+username+"'and @password='"+password+"']");
        if(list.size()>0){
            Element userEle=list.get(0);
            User user=new User();
            user.setUsername(userEle.attributeValue("username"));
            user.setPassword(userEle.attributeValue("password"));
            user.setNickname(userEle.attributeValue("nickname"));
            user.setEmail(userEle.attributeValue("email"));
            return user;
        }else{
            return null;
        }
        
    }
    }

    业务类:UserService.java

    package com.dzq.service;
    
    import com.dzq.dao.XmlUserDao;
    import com.dzq.domian.User;
    import com.dzq.exception.MsgException;
    
    public class UserService {
        private  XmlUserDao dao=new XmlUserDao();
        /**
         * 添加用户
         * @param user
         * @throws MsgException 
         */
        public void registUser(User user) throws MsgException{
            if(dao.findUserByUserName(user.getUsername())!=null){
                throw new MsgException("用户名已经存在");
            }
            dao.addUser(user);
        }
        /**
         * 检查用户名是否正确
         * @param username
         * @param password
         */
        public User isUser(String username,String password){
            return dao.findUserByUNAndPWD(username, password);
            
        }
    }

    处理异常的类MsgException

    package com.dzq.exception;
    
    public class MsgException extends Exception {
    public MsgException(){
    
    }
    
    public MsgException(String msg){
        super(msg);
    }
    }

    测试类:XmlUserDaoTest.java

    package com.dzq.test;
    
    import org.junit.Test;
    
    import com.dzq.dao.XmlUserDao;
    import com.dzq.domian.User;
    
    public class XmlUserDaoTest {
        @Test
    public void testfindUserByUserName(){
        
        XmlUserDao dao=new XmlUserDao();
        User user=dao.findUserByUserName("admin");
        System.out.println(user.toString());
    }
        @Test
        public void testfinduserByUNAndPWD(){
            XmlUserDao dao=new XmlUserDao();
            User user=dao.findUserByUNAndPWD("admin", "admin");
            System.out.println(user);
        }
        @Test
        public void testAddUser(){
            XmlUserDao dao=new XmlUserDao();
            User user=new User();
            user.setUsername("xiaoduc");
            user.setPassword("1234");
            user.setNickname("xiaoduc");
            user.setEmail("duxiao@qq.com");
            dao.addUser(user);
        }
    }

    工具类:XmlDaoUtils.java

    package com.dzq.util;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.UnsupportedEncodingException;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    public class XmlDaoUtils {
        private static Document dom=null;
        private static String path=XmlDaoUtils.class.getClassLoader().getResource("users.xml").getPath();
       private XmlDaoUtils(){
       }
       static{
           try {
                SAXReader reader=new SAXReader();
                 dom= reader.read(path);
                
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException();
            }
           
       }
       public  static Document getDom(){
           return dom;
       } 
       
       public static void refXml(){
           try {
            XMLWriter writer=new XMLWriter(new FileOutputStream(path),OutputFormat.createPrettyPrint());
            writer.write(dom);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        } 
           
       }
    }

    下面是几个servlet

    package com.dzq.web;
    
    import java.io.IOException;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.dzq.domian.User;
    import com.dzq.service.UserService;
    
    
    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
       
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            String username=request.getParameter("username");
            String password=request.getParameter("password");
            UserService service=new UserService();
            User user=service.isUser(username, password);
            if(user==null){
                request.setAttribute("msg", "用户名或者密码错误");
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }else{
                request.getSession().setAttribute("user", user);
                if("ok".equals(request.getParameter("remname"))){
                    Cookie remNameC=new Cookie("remname",URLEncoder.encode(user.getUsername(),"utf-8"));
                    remNameC.setPath(request.getContextPath());
                    remNameC.setMaxAge(3600*24*30);
                    response.addCookie(remNameC);
                }else{
                    Cookie remNameC=new Cookie("remname","");
                    remNameC.setPath(request.getContextPath());
                    remNameC.setMaxAge(0);
                    response.addCookie(remNameC);
                }
                response.sendRedirect(request.getContextPath()+"/index.jsp");
            }
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    package com.dzq.web;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/LogOutServlet")
    public class LogOutServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            if(request.getSession(false)!=null&&request.getSession().getAttribute("user")!=null){
                request.getSession().invalidate();
                response.sendRedirect(request.getContextPath()+"/index.jsp");
            }
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    package com.dzq.web;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.beanutils.BeanUtils;
    
    import com.dzq.domian.User;
    import com.dzq.exception.MsgException;
    import com.dzq.service.UserService;
    
    
    @WebServlet("/RegistServlet")
    public class RegistServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
       
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                UserService service=new UserService();
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //1。检验验证码
            String valistr=request.getParameter("valistr");
            String valistr2=(String) request.getSession().getAttribute("valistr");
            if(valistr==null||valistr2==null||!valistr.equals(valistr2)){
                request.setAttribute("msg", "验证码不正确");
                request.getRequestDispatcher("/regist.jsp").forward(request, response);
                return;
            }
            //2.封装数据,校验数据
            User user=new User();
            BeanUtils.populate(user, request.getParameterMap());
            user.checkValue();
            service.registUser(user);
            request.getSession().setAttribute("user", user);
            response.getWriter().write("恭喜您注册成功,3秒回到主页");
            response.setHeader("refresh", "3;url="+request.getContextPath()+"/index.jsp");
            }catch(MsgException e){
                request.setAttribute("msg",e.getMessage());
                request.getRequestDispatcher("/regist.jsp").forward(request, response);
                return;
            }catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } 
            //3.调用service方法添加用户
            
            //4.提示注册成功,3秒跳转主页
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    package com.dzq.web;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/ValiImg")
    public class ValiImg extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
       
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            response.setDateHeader("Expires", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma","no-cache");
            //1.在内存中构建一张图片
            int height=30;
            int width=120;
            int xpyl=5;
            int ypyl=22;
            int bang=20;
            BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
            //2.获取图像上的画布
            Graphics2D g=(Graphics2D) img.getGraphics();
            //3.设置背景色
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(0, 0, width, height);
            //4.设置边框
            g.setColor(Color.BLUE);
            g.drawRect(0, 0, width-2, height-2);
            //5.画干扰线
            for(int i=0;i<5;i++){
            g.setColor(Color.RED);
            g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height));
            }
            //6.写字
            String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";
            StringBuffer buffer=new StringBuffer();
            
            for(int i=0;i<4;i++){
                g.setColor(new Color(randNum(0, 255),randNum(0, 255),randNum(0, 255)));
                g.setFont(new Font("黑体",Font.BOLD,bang));
                int r=randNum(-45, 45);
                g.rotate(1.0*r/180*Math.PI,xpyl+i*30, ypyl);
                String s=base.charAt(randNum(0, base.length()-1))+"";
                buffer.append(s);
                g.drawString(s, xpyl+i*30, ypyl);
                g.rotate(1.0*-r/180*Math.PI,xpyl+i*30, ypyl);
            }
            request.getSession().setAttribute("valistr", buffer.toString());
            System.out.println(buffer.toString());
            //将图片输出到浏览器
            ImageIO.write(img, "jpg", response.getOutputStream());
            
        }
        private Random rand=new Random();
        private int randNum(int begin,int end){
            
         return rand.nextInt((end-begin)+begin);        
            
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
        }
    }

    自定义标签类:

    package com.dzq.tag;
    
    import java.io.IOException;
    import java.net.URLDecoder;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.SimpleTagSupport;
    
    public class URLDEcoderTag extends SimpleTagSupport {
        private String content;
        private String encode;
    
    public void setContent(String content) {
        this.content = content;
    }
    
    public void setEncode(String encode) {
        this.encode = encode;
    }
    
    @Override
    public void doTag() throws JspException, IOException {
        String str=URLDecoder.decode(content, encode==null?"utf-8":encode);
        getJspContext().getOut().write(str);
        
        
    }
    
    }

    自定义标签的tld文件UserTag.tld

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
     <tlib-version>1.0</tlib-version>
     <short-name>UserTag</short-name>
     <uri>http://www.dzq.com/UserTag</uri>
     <tag>
      <name>URLDecoder</name>
      <tag-class>com.dzq.tag.URLDEcoderTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
       <name>content</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
       <type>java.lang.String</type>
      </attribute>
      <attribute>
       <name>encode</name>
       <required>false</required>
       <rtexprvalue>true</rtexprvalue>
       <type>java.lang.String</type>
      </attribute>
     </tag>
    </taglib>

    下面是存储信息的xml文件users.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <users>
        <user username="admin" password="admin" nickname="admin" email="admin@qq.com" />
    </users>

    以下是jsp页面:

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head>
    </head>
    <body>
    <h1>我的网站</h1><hr>
    <c:if test="${sessionScope.user!=null}">
    欢迎回来!${sessionScope.user.username }<a href="${pageContext.request.contextPath }/LogOutServlet">注销</a>
    </c:if>
    
    <c:if test="${sessionScope.user==null}">
    游客,欢迎你!<a href="${pageContext.request.contextPath }/regist.jsp">注册</a>|<a href="${pageContext.request.contextPath }/login.jsp">登录</a>
    </c:if>
    </body>
    </html>

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <%@taglib uri="http://www.dzq.com/UserTag" prefix="UserTag" %>
    <html>
    <head>
    
    </head>
    <body>
    <div align="center">
    <h1>我的网站_登录</h1><hr>
    <font color="red">${msg }</font>
    <form action="${pageContext.request.contextPath }/LoginServlet" method="post">
    <table border="1">
           <tr>
              <td>用户名:</td>
              
              <td><input type="text" name="username" value="<UserTag:URLDecoder content="${cookie.remname.value }" encode="utf-8"/>"/></td>
           </tr>
           <tr>
              <td>密码:</td>
              <td><input type="password" name="password"/></td>
           </tr>
           <tr>
              <td><input type="submit" value="登录"/></td>
              <td><input type="checkbox" value="ok" name="remname" 
              <c:if test="${cookie.remname!=null }">
              checked="checked"
              </c:if>
              />记住用户名</td>
           </tr>
    </table>
    </form>
    </div>
    </body>
    </html>

    regist.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
    <head>
    <script type="text/javascript">
    function changeImg(img){
        img.src=img.src+"?time="+new Date().getTime();
    }
    </script>
    </head>
     <font color="red" >${msg }</font>
    <body>
    <div align="center">
    <h1>我的网站_注册</h1>
    <form action="${pageContext.request.contextPath }/RegistServlet" method="post">
    <table border="1">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username" value="${param.username }"/></td>
        <tr/>
         <tr>
            <td>密码:</td>
            <td><input type="password" name="password" /></td>
        <tr/>
         <tr>
            <td>确认密码:</td>
            <td><input type="password" name="password2" /></td>
        <tr/>
         <tr>
            <td>昵称:</td>
            <td><input type="text" name="nickname" value="${param.nickname }"/></td>
        <tr/>
         <tr>
            <td>邮箱</td>
            <td><input type="email" name="email" value="${param.email }"/></td>
        <tr/>
         <tr>
            <td>验证码:</td>
            <td><input type="text" name="valistr" /></td>
        <tr/>
         <tr>
            <td><input type="submit" value="注册"/></td>
            <td><img src="${pageContext.request.contextPath }/ValiImg" style="cursor: pointer;" onclick="changeImg(this)"></td>
        <tr/>
    
    </table>
    </form>
    </div>
    </body>
    </html

    运行截图:

    采用了cookie 记住用户名

     源码下载地址 

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/xiaoduc-org/p/5348047.html
Copyright © 2011-2022 走看看