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相应的版本

javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇

然后新建一个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

  

上一篇:ComboBox值排序


下一篇:重度使用示波器进行优化分析——一个DSDA项目回顾