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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

Restful 接口设计最佳事件

本小编这一年是在一家移动互联网公司做App后端接口设计开发工作,最近组内做了一次很大的重构,就是把接口完全根据restful规范进行设计重写。这么做的目的首先是...

1043
来自专栏jouypub

应用性能优化列表

应用开发完了,但是随着用户规模的上升,数据量的积累,系统会越来越慢,性能优化将会伴随着项目一直持续下去

1521
来自专栏源码之家

清空TMP文件夹下的文件

1393
来自专栏13blog.site

小测试

可以在 @RequestMapping 注解里面加上 method=RequestMethod.GET 或者使用 @GetMapping 注解

1611
来自专栏纯洁的微笑

jvm系列(十):教你如何成为Java的OOM Killer

此文出处云时代架构,作者:李艳鹏 教你如何成为Java的OOM Killer 前言 虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,...

5984
来自专栏Golang语言社区

让事件飞 ——Linux eventfd 原理与实践

目前越来越多的应用程序采用事件驱动的方式实现功能,如何高效地利用系统资源实现通知的管理和送达就愈发变得重要起来。在Linux系统中,eventfd是一个用来通知...

8932
来自专栏架构师小秘圈

基于dubbo框架,如何进行大型微服务系统架构设计?

一,为什么需要微服务框架 Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的...

5034
来自专栏大宽宽的碎碎念

为什么DB连接管理一般不采用IO多路复用?

3328
来自专栏张善友的专栏

RESTful API 设计最佳实践

背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计...

3708
来自专栏互联网高可用架构

教你如何成为Java的OOM Killer

1875

扫码关注云+社区

领取腾讯云代金券