学生信息管理系统JavaWeb---填坑

学生信息管理系统JavaWeb

这星期做这个Demo熟悉Servlet遇到挺多坑的,这也是我最近学完servlet第一次做的一个完整的Servlet项目,有点简陋功能不完善,不过也是实现了前后台交互,有时候一个坑填了2,3个小时。
还是来总结一下吧。

Bootstrap引用:

CDN加速快。不过,最好不要用英文版的CDN,不翻墙会崩

    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">  
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

method:

如果有中文参数传递的话,用Post
如果是英文的话 那就Get

action:

Student是项目名,直接 项目名+Servlet 或者直接 DeleteServlet即可 不用包名或者src

<form role="form" action="/Student/DeleteServlet"  
 method="Get">

表单元素属性

id是标识符,name是传递到后台交互用,placeholder是水印

name="id" placeholder="学生  学号"
点击按钮后,frameset的
<frame src="right.html" name="showframe">该浏览窗口改为  
指定页面
onclick="top.showframe.location.href=  
'AddOrUpdateStudent.html?name=Add'"

两个窗体同时转入到Servlet ,那如何判断哪个窗体 ,那就是用页面传值:
如何实现页面之间传递参数:
我是用url:
如上位置:

网址后面加后内容 :?name=Add'

接受参数的页面:

<script type="text/javascript"> 
 window.onload = function () { 
    var name=UrlParm.parm("name");   
    document.getElementById("field_id").value=name;
};  
</script> 

再引用外部js:

<script type="text/javascript" src="js/ready.js"></script>

js内容:

     UrlParm = function() { // url参数    
          var data, index;    
          (function init() {    
            data = [];    
            index = {};  
            var u = window.location.search.substr(1); 
            if (u != '') {    
              var parms = decodeURIComponent(u).split('&');    
              for (var i = 0, len = parms.length; i < len; i++) {    
                if (parms[i] != '') {    
                  var p = parms[i].split("=");    
                  if (p.length == 1 || (p.length == 2 && p[1] == '')) {// p | p=    
                    data.push(['']);    
                    index[p[0]] = data.length - 1;    
                  } else if (typeof(p[0]) == 'undefined' || p[0] == '') { // =c | =    
                    data[0] = [p[1]];    
                  } else if (typeof(index[p[0]]) == 'undefined') { // c=aaa    
                    data.push([p[1]]);    
                    index[p[0]] = data.length - 1;    
                  } else {// c=aaa    
                    data[index[p[0]]].push(p[1]);    
                  }    
                }    
              }    
            }    
          })();    
          return {    
            // 获得参数,类似request.getParameter()    
            parm : function(o) { // o: 参数名或者参数次序    
              try {    
                return (typeof(o) == 'number' ? data[o][0] : data[index[o]][0]);    
              } catch (e) {    
              }    
            },    
            //获得参数组, 类似request.getParameterValues()    
            parmValues : function(o) { //  o: 参数名或者参数次序    
              try {    
                return (typeof(o) == 'number' ? data[o] : data[index[o]]);    
              } catch (e) {}    
            },    
            //是否含有parmName参数    
            hasParm : function(parmName) {    
              return typeof(parmName) == 'string' ? typeof(index[parmName]) != 'undefined' : false;    
            },    
            // 获得参数Map ,类似request.getParameterMap()    
            parmMap : function() {    
              var map = {};    
              try {    
                for (var p in index) {  map[p] = data[index[p]];  }    
              } catch (e) {}    
              return map;    
            }    
          }    
        }();   

可以通过表单来传递参数给Servlet,表单有元素可以接收到传递过来的参数:

<input type="hidden" name="field_name" id="field_id"  
 value="value" />

如何接收呢?

<script type="text/javascript"> 
 window.onload = function () { 
    var name=UrlParm.parm("name");   
    document.getElementById("field_id").value=name;
};  
</script> 

下拉菜单按钮:

   <ul class="dropdown-menu" role="menu">
                <li><a href="LookStudentOne.html" target="showframe">根据学号查找</a></li>
                <li><a href="/Student/LookServlet" target="showframe">查找全部</a></li>
            </ul>

字符串判断的时候使用equals 比较的是内容是否相同 最保险。

if(req.getParameter("username").equals(name)&&req.  
getParameter("password").equals(pwd)) 

登陆页面如何验证账号密码:
当作表单传入后台和web.xml比较

<servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>background.LoginServlet</servlet-class>      //包名+类名
        <init-param>
            <param-name>name</param-name>
            <param-value>jjc</param-value>
        </init-param>
        <init-param>
        <param-name>pwd</param-name>
        <param-value>111510</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>                         // 名字和上面的一样
        <url-pattern>/ss</url-pattern>                             //  不能少了/
    </servlet-mapping>

注意:<init-param> 只能存放一组信息 而且仅该servlet可见。 <servlet>和 <servlet-mapping>配套一般

如果 这里<url-pattern>/ss</url-pattern> 登陆界面也是action  
="/Work/ss"
css中${ pageContext.request.contextPath }是表示全局变量是  
该项目\\和/都可以
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();     
放在getwriter前面改变编码格式。

设置响应实体内容编码

//response.setCharacterEncoding("utf-8");
 服务器发送给浏览器的数据类型和内容编码
//response.setHeader("content-type", "text/html");
response.setContentType("text/html;charset=utf-8");  
//和上面代码等价。推荐使用此方法

页面跳转:

out.println("<script type='text/javascript'> alert('信息正确')</script>");
resp.sendRedirect("/Work/index.html");

但是有个问题 来不及提示信息就直接跳转了

换个方法:

resp.getWriter().write("<script language=javascript>  
alert('您还没有登录,请先登录');window.location = 'Login.html';  
</script>");

导入项目问题:

导入文件可以你先创建一个 然后improt 或者File Open Projects from File System
有时候遇到了问题:就是 项目无法run tomcat 我是直接在eclise删除 然后重新导入即可

遇到了文件有个xx问号……重新创建了一个新的 然后在eclipse的存放目录里面 直接复制过去eclipse会自动导入。如果tomcat有问题 那重新导入tomcat

问题:

starting tomcat server 占用端口:  
http://www.cnblogs.com/rainman/p/3457227.html#m1  
C:\Users\蒋家聪>taskkill /pid 5524

错误: 无法终止 PID 为 5524 的进程。
原因: 只能强行终止这个进程(带 /F 选项)。

C:\Users\蒋家聪>/F
‘/F’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\蒋家聪>taskkill /f /pid 5524
成功: 已终止 PID 为 5524 的进程。

Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires

表示servlet启动时间到了 还没启动
修改时间即可

后台获取前台url
问题:如果是location 就是null

String referer=request.getHeader("referer");
http://localhost:8080/Student/LookStudentOne.html

重点 :如果是页面跳转的话:location

setText问题:

studentOne.element("age").setText(student.getAge()+""); 

数字不能赋值给字符串 所以要+”“

Student student=new Student();
        student.setAdress("aaa");
        student.setAge(22);
        student.setGender("aa");
        student.setId("12");
        student.setName("aaa");
        student.setPhone("aa");
        student.setQQ("aa");
        new studentsx().addStudent(student);
                少一个都不行  因为无法添加空值
        studentElement.addElement("QQ").setText(  
        student.getQQ());

抛出异常:一般可以转换成运行时异常:

catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

FileOutputStream :构造函数 是否会创建文件?

FileOutputStream fileOutputStream=new FileOutputStream("./src/Students.xml");要是目录存在 就创建文件 要是不存在就不创建。

注意:不能用 .

在项目中不能用 File file=new File("./Students.xml");
        因为System.out.println(file.getAbsolutePath());
        C:\Program Files\eclipse\.\Students.xml
        不在工作空间里面

如何将一段代码提取出来?

    选中代码-->右键-->refactor-->Extract Method

Node和 Element 区别?

    Node是包括了Element  而Element只代表标签元素
<label class="radio-inline"><input type="radio" name="gender" value="男">男</label>
传递到后台 是乱码 虽然页面是utf-8 但是它是内部value传递过去的  不属于页面内部

GET和Post提交问题 :

post刷新页面的时候会重新提交 
get不会

项目一定要复制完整
java.lang.ClassNotFoundException: org.dom4j.DocumentException

在使用dom4j的时候将dom4j-1.6.1.jar添加到project>>properties>>Java Build Path>>Libraries中,但在运行时仍会报出以下错误:

    不过通过单元测试是可以运行的  说明代码没问题 就是 tomcat的问题
    这个时候打开tomcat项目的lib里面 其实没有东西 所以要把
    dom4j-2.1.0.jar和jaxen-1.1-beta-6.jar都复制过来 

注意:
   必须还要将dom4j-1.6.1.jar添加到WebRoot>>WEB-INF>>lib中,才能正常使用。

eclipse配置项目到tomcat的时候只是把class文件和html文件拷贝过去而已 后来添加的jar包和图片都没有进去

还有个问题:

       java.lang.ClassNotFoundException: org.dom4j.DocumentHelper
   解决方法:
   报错的原因是,我自己把dom4j-1.61.jar文件放在webContent/lib/文件夹下,网站运行时,不能找到这个jar文件。把dom4j-1.61.jar放在WebContent/WEB-INF/lib文件夹下,然后引入项目中就可以了。

tomcat对Class Load有一定的规则,并不是任意位置的jar文件都可以引用。具体说明可以参考tomact文档相关页面:http://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

从Web应用程序的角度来看,类或资源加载按以下顺序在以下存储库中查找:

JVM的引导类
/ WEB-INF /您的Web应用程序的类
/WEB-INF/lib/*.jar您的Web应用程序
系统类加载器类(如上所述)
通用类加载器类(如上所述)
Exception processing loader

遇到个问题 就是 文件如果是绝对路径保存到电脑位置 没问题
但是用
File file=new File(“./src/Students.xml”);
但是 c盘重新加载后 会覆盖掉tomcat中的内容
意思就是tomcat中原来的webContent/lib/的jar就会消失
因为c盘位置没有

ready 和load区别?

ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件);

load,表示页面包含图片等外部文件在内的所有元素都加载完成。

一定要浏览器清空数据 不然会有影响得 发誓

(Element) document.selectSingleNode("//Student[@id='"+student.getId()+"']").elementText("adress")
如果这个element不存在  那么返回的不是null 而是一个空值

会报错java.lang.NullPointerException

换行问题?
页面内无法考\n换行 所以 需要br

student.toString()).append("<br />"

File中.无效再tomcat中得绝对路径,任意位置都行

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/80727102