学生信息管理系统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中得绝对路径,任意位置都行