javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇
即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程
今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了。首先我的项目名称叫做智能班车管理系统。
项目的概况:
该软件产品是针对员工数量众多的大型公司,解决其由于人员流动性大,公司缺乏完善的管理系统,无法对车辆、人员及线路等信息进行有效管理,导致管理混乱、效率低下、资源浪费等问题。在移动互联网蓬勃发展的今天,各种包含数据分析、图形可视化等技术的管理系统在企业经营过程中发挥着巨大的作用,单靠人工进行管理已经无法满足企业的发展需求。从班车资源管理角度来说,很有必要对每辆车的乘坐率以及每条线路上的站台人数等进行统计,形成统计报表和统计模型,进而方便了解班车资源的使用情况,从而使管理者能够对资源进行合理的分配和管理。因此,小组针对这些问题,在经过不断地分析和总结后,提出以下项目建设目标,实现系统的全局优化。
上学期已经把这个项目的需求分析文档和设计文档完成了,如果需要的话可以到博客文件里面下载。
一,搭建环境
接下来是开发了,由于我的项目是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