即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程
今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了。首先我的项目名称叫做智能班车管理系统。
项目的概况:
该软件产品是针对员工数量众多的大型公司,解决其由于人员流动性大,公司缺乏完善的管理系统,无法对车辆、人员及线路等信息进行有效管理,导致管理混乱、效率低下、资源浪费等问题。在移动互联网蓬勃发展的今天,各种包含数据分析、图形可视化等技术的管理系统在企业经营过程中发挥着巨大的作用,单靠人工进行管理已经无法满足企业的发展需求。从班车资源管理角度来说,很有必要对每辆车的乘坐率以及每条线路上的站台人数等进行统计,形成统计报表和统计模型,进而方便了解班车资源的使用情况,从而使管理者能够对资源进行合理的分配和管理。因此,小组针对这些问题,在经过不断地分析和总结后,提出以下项目建设目标,实现系统的全局优化。
上学期已经把这个项目的需求分析文档和设计文档完成了,如果需要的话可以到博客文件里面下载。
一,搭建环境
接下来是开发了,由于我的项目是JavaWeb,所以开发工具是用MyEclipse,MyEclipse开发Web比较方便,本身功能和Eclispe差不多,比Eclipse要多,Eclipse开发web需要下载插件。 其次需要用Tomcat服务器来发布网页。再其次,数据库用的是Oracle。
先下载一个MyEclipse,
安装完MyEclispse,就可以下载Tomcat。根据自己的JDK版本,选择不同的版本,32位和64位根据自己的MyEclipse选择。我下载的是Tomcat6.0 JDK版本是1.6,这个要对应好,MyEclipse版本是MyEclispe 10 。
在安装Tomcat的时候可能会遇到一些问题:
1.Tomcat 无法正常启动 点击start.bat出现一闪而过的问题。
2.Tomcat 可以启动,但是浏览器无法进入localhost:8080/界面。
第一个原因,大多没有配置JAVA_HOME或者JRE_HOME导致的环境变量配置的问题,这里百度上一大把教程,配置一下就好。
第二个可能是有些程序占用了8080端口,可以用netstat命令在cmd查看端口占用情况,换一个端口试试.
接下来在MyEclipse中配置Tomcat。window->preferences->搜索Tomcat->点击Tomcat相应的版本
然后新建一个Web项目,把Web项目部署到Tomcat里面,再在MyEclipse启动Tomcat,就可以了,这里我就不赘述了。
二,搭建SSH框架
搭建完环境之后,可以开始搭建SSH框架。Struts+Hibernate+Spring.这些天一直在研究这个框架,感觉至少有点体会了。首先说Struts 框架:
1,Struts
首先我们要明确一点SSH框架就是,SSH框架无非就是通过各种封装,使得程序变得简洁,易修改,代码耦合度降低。关于代码耦合度再说到Spring的时候再去研究一波。那么具体的,Struts在Web开发中是封装什么的呢。
Web程序中,前端发送请求给后端,后端返回数据给前端。我们可以有两种方式:
1)第一个就是普通的前端form表格(或者用AJAX)提交action 到相应url ,后台的url文件,通过Severlet的requset获取前端提交的数据,response向前台输出数据。
举个例子:前端的提交表单:
<form action="login.jsp" method="post" align="center"> <input id="name" type="text"></input>
<input id="pwd" type="password"></input>
<input type="submit">登录</input> </form>
这个时候后台建立一个相应的login.jsp 这里也可以是java文件,那么action="类名"
<script>
var name=request.getParameter("name");
var pwd=request.getParameter("pwd");
if(Check(name,pwd)==true)
response.getWriter().print("登录成功");
else
response.getWriter().print("登录失败"); </script>
response 也可以通过OutputStream向前台写数据
response.setHeader("Content-type","text/html;charset=UTF-8");//向浏览器发送一个响应头,设置浏览器的解码方式为UTF-8
String data = "中国";
OutputStream stream = response.getOutputStream();
stream.write(data.getBytes("UTF-8"))
如果是传向后台的java文件,那么java类要继承HttpServelt。可以在后台建立new->Servelt文件,这里因为Jsp页面有request,response和session等内置对象,所以在JSP页面中可以直接使用
而在继承Servelt的java类中,MyEclipse给你写好了DoGet,和DoPost方法,分别接受前端的Post方法和Get方法。在里面写相应的操作就好了。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
2), 这样的普通方式,我们需要在前台和后台写大量的代码,那么另外一种方式就是通过Struts 框架,封装操作。Struts 其实就是后端接受前端的数据,和返回数据,封装起来。你无需写requset或者responseStruts帮你弄好了。这里就要介绍Struts的结构。
a. Struts最核心的东西是拦截器。在web.xml里面配置Struts之后,那么web就会加载Struts的拦截器,代码后面贴出。然后你前台的发送给后台的拦截器,都会被Struts拦截,根据Struts.xml的配置,将你的请求 转到相应的后台action文件。这里可以看出,Struts框架要素有三个:1,web.xml配置Struts的核心控制器,用来拦截用户的请求,并将请求转发给相应的Action类来处理;2,Struts.xml是管理Action的映射,Struts的核心功能就是拦截器;3要有相应action类是后台操作类。还有一个,Struts有自己标签库,大大方便了前端向后端传送数据。
b. 接下来我们就开始配置Struts。这里示范Struts2的配置。首先我们准备Struts2的包,Struts2的包我会提供,里面一共有9个包。将这个9个包拷贝到WEB-INF的lib目录下即可。少一个,都会报错的!
第二部,配置Web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<!-- 配置Struts2核心控制器的名字 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts2核心控制器的实现类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 配置Struts2拦截的URL -->
<filter-mapping>
<!-- 配置Struts2拦截器的名字 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts2的核心FilterDispatcher拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
这里要注意/*是所有请求,如果*.action是所有action请求,我之前犯了一个错误就是这里写的是*.action,然后前台的请求没有加上.action后缀,导致无法拦截请求!
web.xml配置之后。我们开始配置Struts.xml文件,新建一个xml(Basic) 然后里面的内容替换如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- 配置包元素-->
<package name="default" namespace="" extends="struts-default">
<!-- 配置action-->
<action name="login" class="com.aciton.loginAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
配置action,首先name="xxx" 的意思就是拦截前端名称为login的请求,class="xxx" 的意思是将这个请求发送到后台com.action.loginAction类中。这个类可以事先建好。 接下来有一个method="xxx" ,这是值具体映射到类中的某个方 法,如果不写就是默认的execute()方法。
<result name="success">xxx.jsp</result> 意识后端action类返回success的时候,跳转到xxx.jsp。<result> 是Struts中的输出和跳转组件。后面会详解。
现在我们要明白这样一个流程,当Tomcat发布网站的时候,会通过Web.xml加载Struts的控制器和拦截器,然后如果前端页面有任何的请求都会被Struts拦截,接着通过Struts.xml的配置映射到相应的action控制类,
还要注意一点struts.xml不能是Struts.xml否则会报错。
这样Struts框架就已经搭建好了。很简单,对不对。
接下来就是前段的界面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
This is my JSP page. <br>
<form action="login" method="post">
用户:<input name="name" type="text"></input>
密码:<input name="pwd" type="password"></input>
<input type="submit" value="登录"></input>
</form>
<s:form action="login">
<s:textfield label="用户" name="name" ></s:textfield>
<s:password label="密码" name="pwd" ></s:password>
<s:submit type="submit" value="登录" ></s:submit>
</s:form>
</body>
</html>
这里我用了两种方式,一个struts标签库,另一个就是普通的标签,二者效果一样的。
后台的action类:
package com.action;
import com.opensymphony.xwork2.ActionSupport; public class loginAction extends ActionSupport{ private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
private String pwd; public String execute(){ System.out.println("ok");
if(name.equals("123")&&pwd.equals("123")) return SUCCESS;
else
return INPUT;
} }
这里要强调,action类里面的name和pwd必须和前台的name="name" name="pwd",一样,这样才能传到后台。这里我们看到,后台不需要写request来获取前端传过来的值,因为我们有了set访问器,通过Struts自动传了值,简化了代码
一个最简单的Struts框架就搭建了。
http://download.csdn.net/detail/dacc123/9801938 这是下载地址,可以下载StrutsTest压缩包,是Struts的简单实例。
c. 搭建完Struts后,我想用Struts的标签库来做前端。可是小组分工之后,前端页面是别的组员做的。登录界面拿过来之后傻眼了,没有form表格,更没有<s:form> 这要怎么办?我在想如果把标签都换成Struts的呢,后来改了一下,发现效果 都没有了。虽然Struts标签有个cssStyle.但是改了之后,虽然有变化,但还是磨合不到一起去。这样的话,只能用别的方式了,没有form表格,只有ajax了。AJAX是一种异步传输技术。AJAX 是与服务器交换数据并更新部分网页的艺术,在 不重新加载整个页面的情况下。这里也就图一个方便,可以不用form表格来提交数据。之后会详解AJAX。Ajax也是想后端发送post和get请求,所以struts的作用仍然有,只是没有标签的情况下,作用少了一点。接下来就尝试着用ajax通过 Struts向后台传送Json数据,并返回Json数据。
AJAX 其实很简单,它有这些属性:(我们这里说的Jquery中的AJAX方法,AJAX的基础是XMLHttpRequest 。我们用Jquery的AJAX方法更简洁)
url:请求发送的地址
data:想请求地址发送的数据
type:发送请求的类型
success:function(data):请求发送成功的回调函数
datatype:希望服务器返回数据的类型
async:是异步请求还是同步请求(其实这个异步和同步请求,很简单,异步请求就是发送了请求之后不跳转界面,而同步请求发送了请求了之后需要跳转界面)
fail:function(data):请求失败的回调函数
还有一些别的参数,我没有用到。
Jquery的AJAX函数有两种写法,一种是
$.ajax({
"type":"post",
"url":"login",
"traditional":true,
"data":{"name":"123","password":"123"},
"type":"json",
"contentType": "application/x-www-form-urlencoded; charset=utf-8",
"success":function(data){ };
"fail":function(data)
}
})
还有一种就是上面的简写:
$.post("login.action",{"name":name,"password":pwd,"identity":identy},function(data){},"json")
上面的是post的方法,get方法也一样
首先在前台界面:
ajax 向后台传数据<br> 用户:<input id="name" name="name" type="text"></input>
密码:<input id="pwd" name="pwd" type="password"></input>
<input type="submit" value="登录" onclick="fun()"></input>
和ajax方法:
<script>
function fun(){ alert("ok");
$.post("login2",{name:$("#name").val(),pwd:$("#pwd").val()},function(data){ alert(data);
var d = eval("(" + data + ")"); if(d.login=="success"){ window.location.href = "success.jsp";
}
else
window.location.href = "index.jsp";
},"json");
}
</script>
同是我们需要导入
struts2-json-plugin-2.3.8.jar 这个包是支持在Struts下传送Json数据的
在Sturts.xml配置文件中
<package name="default" namespace="" extends="struts-default,json-default">
<action name="login" class="com.action.loginAction">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result> </action> <action name="login2" class="com.action.loginAction">
<result name="success" type="json">
<param name="root">result</param>
</result>
</action> </package>
extends加上一个json-default 在添加一个action
<result name="success" type="json"> 是返回前台json数据的result类型
<param name="root">result</param> 将后台的result的字符串变成Json格式的数据再传递到后台<param></param>标签就是一个参数赋值的标签,把result赋值给了root。
在后台我们添加result
package com.action;
import com.opensymphony.xwork2.ActionSupport; public class loginAction extends ActionSupport{ private String name;
private String pwd; private String result; public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} public String execute(){ System.out.println("ok");
System.out.println(name+" "+pwd);
if(name.equals("123")&&pwd.equals("123")){
result = "{\"login\":\"success\"}";
return SUCCESS;
}
else{
result = "{\"login\":\"fail\"}";
return INPUT;
} } }
注意result必须要有get,set访问器。
然后就可以实现ajax 向Struts后台传送json数据,我写了一个实例,大家可以下载
http://download.csdn.net/detail/dacc123/9824358