• 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

      

     

  • 相关阅读:
    2015-04-10一些知识点
    2015-04-07一些知识点
    斐波那契数列算法
    进制转换算法
    Java中transient有何作用?
    RandomAccessFile的使用
    Java各种类型占用的字节数
    LineNumberReader类的使用
    PreparedStatement和Statement的区别
    ResultSet几种类型的区别
  • 原文地址:https://www.cnblogs.com/dacc123/p/6188623.html
Copyright © 2020-2023  润新知