ssh学习笔记一:

1 今天开始学习struts,新建了项目,简单的配置了web.xml,pom.xml,struts.xml,

1.1 pom配置文件添加struts2配置

        <!--Struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>2.3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.16</version>
        </dependency>           

1.2 web.xml添加过滤器配置如下

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>*.action</url-pattern>
  </filter-mapping>

1.3 struts.xml添加action配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
     <!-- 编码 -->
     <constant name="struts.i18n.encoding" value="UTF-8" />

      <!-- struts2的action必须放在一个指定的包空间下定义 -->
     <package name="default" extends="struts-default" namespace="/">
           <!-- 定义处理请求URL为login.action的Action -->
         <action name="login" class = "com.study.struts.LoginAction">
              <!-- 定义处理结果字符串和资源之间的映射关系 -->
             <result name = "success">success.jsp</result>
             <result name = "error">error.jsp</result>
         </action>
    </package>
</struts>

1.4 启动tomcat时报错如下:

Caused by: java.lang.NullPointerException
    at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:230)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyResultType(XmlConfigurationProvider.java:604)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addResultTypes(XmlConfigurationProvider.java:574)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:530)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:292)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:258)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489)
    ... 15 more

1.5、解决办法两个:

1.5.1 lib中多导入包的原因

去掉pom中struts2-spring-plugin依赖配置,因为没有用到spring

       <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.16</version>
        </dependency>     

1.5.2 用了spring加上却没加监听器,在web.xml里面加上

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

2.1 了解Struts2返回JSON数据的原理

2.1.1 在视图资源中输出JSON数据

Action处理完用户请求后,将数据存放在某一位置,如request中,并返回视图,然后Struts将跳转至该视图资源,在该视图中,我们需要做的是将数据从存放位置中取出,然后将其转换为JSON字符串,输出在视图中。这跟传统WEB应用中在JSP页面输出JSON数据的做法如出一辙:

public String testByJSP() {
        User user = new User();
        user.setId("123");
        user.setName("Struts2");
        user.setPassword("123");
        user.setSay("Hello world !");
        JSONObject jsonObject=new JSONObject();
        jsonObject.accumulate("user", user);
        //这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect"
        ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());
        return SUCCESS;
    };

配置文件

<package name="default" extends="struts-default" namespace="/">
           <!-- 定义处理请求URL为login.action的Action -->
         <action name="testByJsp" class = "com.study.struts.LoginAction" method="testByJsp">
              <!-- 定义处理结果字符串和资源之间的映射关系 -->
             <result name = "success">login/success.jsp</result>
             <result name = "error">login/error.jsp</result>
         </action>
    </package>

error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
${data }

2.1.2 在Action中以传统方式输出JSON数据

action代码

public void testByGeneral() throws IOException{
        HttpServletResponse response=ServletActionContext.getResponse();
        //以下代码从JSON.java中拷过来的
        response.setContentType("text/html");
        PrintWriter out;
        out = response.getWriter();
        //将要被返回到客户端的对象
        User user=new User();
        user.setId("123");
        user.setName("JSONActionGeneral");
        user.setPassword("JSON");
        user.setSay("Hello , i am a action to print a json!");
        JSONObject json=new JSONObject();
        json.accumulate("success", true);
        json.accumulate("user", user);
        out.println(json.toString());
//      因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端
//      以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段
//      String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
//      out.println(jsonString);
        out.flush();
        out.close();
    }

struts.xml中的配置:

<package name="default" extends="struts-default" namespace="/">
         <action name="testByGeneral" class = "com.study.struts.LoginAction" method="testByGeneral"></action>
    </package>

注意:这个action没有result,且doAction方法没有返回值!

2.1.3 在Action中以Struts2的方式输出JSON数据

action代码

public String testByAction() {
        // dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
        dataMap.clear();
        User user = new User();
        user.setId("123");
        user.setName("JSONActionStruts2");
        user.setPassword("123");
        user.setSay("Hello world !");
        dataMap.put("user", user);
        // 放入一个是否操作成功的标识
        dataMap.put("success", true);
        // 返回结果
        return SUCCESS;
    }

struts.xml中action的配置:

 <package name="json" extends="json-default" namespace="/">
        <action name="testByAction" class="com.study.struts.LoginAction" method="testByAction">
            <result type="json">
            <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
            <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
            <param name="root">data</param>
            <!-- 指定是否序列化空的属性 -->
            <!--
            <param name="excludeNullProperties">true</param>
            -->
            <!-- 这里指定将序列化dataMap中的那些属性 -->
            <!--
            <param name="includeProperties">userList.*</param>
             -->
            <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
            <!--
            <param name="excludeProperties">SUCCESS</param>
            -->
            </result>
        </action>
    </package>

第三种方法配置后,启动报错:

Caused by: Unable to load configuration. - [unknown location]
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489)
    ... 15 more
Caused by: Parent package is not defined: json-default - [unknown location]
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildPackageContext(XmlConfigurationProvider.java:670)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:519)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:292)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:258)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    ... 17 more

原因 未加入struts2-json-plugin-2.3.16.3.jar 包,pom添加依赖

 <dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>2.3.16</version>
</dependency>

3 注解方式访问action

3.1 基本配置

3.1.1 pom.xml中引入struts2-spring-plugin包

<dependency>
           <groupId>org.apache.struts</groupId>
           <artifactId>struts2-spring-plugin</artifactId>
           <version>2.3.16</version>
     </dependency>

3.1.2 web.xml加入spring监听器

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

3.1.3 struts.xml中加入

  <!-- struts运行时由Spring创建对象 -->
     <constant name="struts.objectFactory" value="spring"/>

3.2 通过命名空间namespace和action注解访问

package com.study.struts;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;

import com.opensymphony.xwork2.ModelDriven;
import com.study.entity.User;
import com.study.utils.struts.BaseAction;

@Namespace("/annotationTest")
public class AnnotationTest extends BaseAction implements ModelDriven<User>{
    private User  user = new  User();
    @Action("/test")
    public  String  testAnnotation(){
        String  val = "";
        if("gyh".equals(user.getUserName())){
            val  = "测试 annotation方式的action 成功";
        }else{
            val = "失败";
        }
        this.writeJson2Page(val);
        return "hh";
    }

    @Override
    public User getModel() {
        return user;
    }
}

浏览器直接访问url

3.3 通过controller注解方式访问

3.3.1 在struts.xml中配置访问路径,class可以直接指向bean,如果在类中找不到会从spring管理的bean中找

 <package name="package3" extends="struts-default" namespace="/">
        <action name="test" class="userAction" method="getUserName"></action>
    </package>

在浏览器访问如下

3.3.2 如果有多个action,每个action有多个方法,可以如下匹配配置

<package name="package3" extends="struts-default" namespace="/">
         <action name="*!*" class="{1}" method="{2}"></action>
    </package>

userAction代码如下

package com.study.struts;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ModelDriven;
import com.study.entity.User;
import com.study.utils.struts.BaseAction;

@Controller("userAction")
@Scope("prototype")
public class UserAction extends BaseAction implements ModelDriven<User>{
    private User user = new User();
    @Override
    public User getModel() {
        return user;
    }
    public void getUserName(){
        String val = "";
        if(user == null){
            val =  "输入要查询的用户";
        }
        if("gyh".equals(user.getUserName())){
            val = "高玉环";
        }else{
            val = "用户不存在";
        }
        writeJson2Page(val);
    }
}
时间: 2024-12-30 09:34:46

ssh学习笔记一:的相关文章

SSH学习笔记

一.Struts        在没有学习SSH框架前,我们一般采用Jsp+java bean+servlet开发,这里就是MVC架构.而Struts其实就是替代了Servlet,我们知道Servlet在一般的开发中做控制页面跳转,同时调用系统的业务逻辑层.现在想想Struts是不是做一样的是?只是它能够更加的提高开发速度.我们Servlet开发时,是要创建一个Servlet其实就是继承了HttpServlet这个类.而现在Struts里面的Action也要集成一个ActionSupport类.

【SSH学习笔记】用Struts2实现简单的用户登录

准备阶段 在使用学习Struts2的时候首先要下载相应的架包 Struts2资源下载 这里建议下载第一个,在struts-2.5.14.1-all.zip里有很多实用的东西,不仅有架包还有官方为开发者准备的实例等. 任何所学的知识最有效的检测方式就是做一个小小的实例,这里吉力就带着大家看看Struts2是怎么实现这个功能的. Struts2核心jar包: struts2-core-2.3.15.3.jar asm-3.3jar asm-common-3.3jar asm-tree-3.3jar

SSH学习笔记(二)

1 # 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 2 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port ! 3 # 亦即重复使用 port 这个设定项目即可! 4 Protocol 2,1 # 选择的 SSH 协议版本,可以是 1 也可以是 2 , 5 # 如果要同时支持两者,就必须要使用 2,1 这个分隔了! 6 #ListenAddress 0.0.0.0 # 监听的主机适配卡!举个例子来说,如果您有

【SSH学习笔记】—从配置Struts1环境到简单实例

以下我将从一个简单点的计算器实例,介绍struts1的环境配置,以及其重要的两个核心类:ActionForm和Action  简单计算器实现思路: 1.提供一个输入界面,输入两个数字和运算符(+.-.*./),提交后将运算结果显示出来.假设出现错误显示错误页面,在正确页面和错误页面须要显示出输入值.运算符和计算结果. 2.发送计算请求.须要Action处理这个请求.并将计算结果返回.此外,发请求须要传送数据才干计算.所以须要一个ActionForm来进行数据传送.表单上传送过来的数据都是字符串的

ssh 学习笔记

1.ssh简单介绍 SSH(Secure SHell), 是一种建立在应用层和传输层上的安全协议,  专为远程登录会话和其他网络服务提供安全性.可以有效防止远程管理过程中信息泄露问题, 比如 (Man-In-The-Middle 中间人), 是一个开源协议, 起源于Unix. 和 ftp,pop,Telnet比较: ftp,pop和Telnet使用明文传输口令和数据, 而ssh使用加密传输,并且能防止DNS和IP哄骗, ssh的传输数据经过了压缩,可以提高传输速度. ssh还有其他很多功能, 比

[SSH] SSH学习笔记 - 远程登录

1.SSH登陆/登出命令 $ ssh <hostname> #登入 $ exit #登出 known_hosts 每个用户都有自己的known_hosts文件,路径:(username)/.ssh/known_hosts /etc/目录下的known_hosts文件 2.登录方式: 输入密码登陆 公钥登陆 1 $ ssh-keygen # 可以加入相关参数选择加密方式,如[-t rsa] 2 #将生成的密钥对中的公钥拷贝到远程服务器上 3 $ scp /Users/(local_usernam

2016年1月5日 SSH学习笔记

1月5日 1.为什么有的配置的过滤器的类是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,有的配置的过滤器是org.apache.struts2.dispatcher.FileDispatcher? 因为,从struts-2.1.3以后,org.apache.struts2.dispatcher.FileDispatcher值被标注为过时.虽然仍然起作用,但是不建议使用. 2.为什么有的时候不用execu

SSH学习

SSH 学习笔记 SSH:struts + hibernate + spring 第一部分:struts2 (没有数据库) struts2 简介 servlet解耦,实现了MVC的思想: struts2 配置文件的标签 package name:唯一标识一个包,不能重名: extends:继承其他包,可以直接使用该包中的资源: abstract:true 包为抽象包,不能写action标签.默认为false: namespace:命名空间,注意搜索机制,默认namespace="/":

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系