• struts


    1.struts初步了解

    什么是框架:

      框架简单来说是一个半成品的项目,用了框架之后我们会更快,更好的完成项目。

    什么是struts:

      strut2是处理访问服务器的请求

      取代serylet

    struts下载

    2.使用传统的servlet编写用户登录功能

    3.使用struts2编写用户登录功能

    4.对比两种方式

    •      (1)启动:

    servlet:无

    struts:配置filter

    web.xml中配置如下:       启动项

    •  (2)创建:

    servlet:继承HttpServlet,重写doget与dopost方法

                 添加注解或者配置web.xml

    struts: 继承ActionSupport,写一个返回值为String而且抛出一个异常。

              配置struts.xml

    <package name="MyPackage" namespace="/" extends="struts-default">
    <action name="loginAction" class="com.web.UserAction" method="execute">
    <!-- 默认为转发 -->
    <result name="success" type="redirect">/index.html</result>
    <result name="error">/login.jsp</result>
    </action>
    </package>

    • (3)封装数据:

    servlet:使用BeanUtils工具通过name封装,BeanUtils.populate(user,request,getParameterMap)

    struts:实现ModelDriven接口,实现getModel方法,返回一个对象就是我们封装数据的对象。(先把对象new出来)

             也是通过name属性进行封装的。

    • (4)转发与重定向

    servlet:  

              重定向:response.sendRedirect(request.getContextPath()+"/index.html");

      请求转发:request.getRequestDispatcher("/login.jsp").forward(request, response);

     struts:

      重定向:<result name="success" type="redirect">/index.html</result>

           转发(默认):<result name="error">/login.jsp</result>

    5.学习struts2重点

              struts.xml   ----------书写Action

            -----核心配置

    name:配置包名 

    namespace:给action的访问路径定义一个命名空间

    action:配置action类
    name:决定了action访问的资源名称

    servlet:url-pattern
    class:action的完整类名
    method:指定调用了action中的哪个方法来处理请求

            ------动态方法调用

            -----结果集的处理

            -------转发

            ------重定向

            -------转发到Action

            ------重定向到Action

         

    动态方法调用如下:

        主要配置:                  

    • <constant name="struts.devMode" value="true"></constant>
    • <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    • <global-allowed-methods>login,register,kill</global-allowed-methods>

    允许该action下的所有请求: 

    <global-allowed-methods>regex:.*</global-allowed-methods>

     

    dao

    package com.dao;
    
    import java.sql.SQLException;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import com.domain.User;
    import com.yl.lain.utils.C3p0DataSourceUtils;
    
    public class UserDao {
    
        public User findUser(User user) throws SQLException {
            QueryRunner runner=new QueryRunner(C3p0DataSourceUtils.getDataSource());
            String sql="select * from user where username=? and password=?";
            runner.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
            
            return null;
        }
    
    }
    View Code

    domain:

    package com.domain;
    
    public class User {
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public User(String username, String password) {
            super();
            this.username = username;
            this.password = password;
        }
        public User() {
            super();
            // TODO Auto-generated constructor stub
        }
        
    }
    View Code

    service:

    package com.serive;
    
    import java.sql.SQLException;
    
    import com.dao.UserDao;
    import com.domain.User;
    
    public class UserService {
    
        public boolean findUser(User user) throws SQLException {
            UserDao userDao=new UserDao();
            User temp=userDao.findUser(user);
            
            return temp==null?false:true;
        }
    
    }
    View Code

    web:

    package com.web;
    
    public class DefaultAction {
        public String execute() {
            System.err.println("这是一个普通的Action");
            return null;
        }
    }
    View Code
    package com.web;
    
    import com.opensymphony.xwork2.Action;
    
    public class ImplAction implements Action{
    
        @Override
        public String execute() throws Exception {
            System.err.println("这是实现了action接口的Action");
            return null;
        }
        
        
    
    }
    View Code
    package com.web;
    
    
    
    import org.apache.struts2.ServletActionContext;
    
    import com.domain.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.serive.UserService;
    
    public class UserAction extends ActionSupport implements ModelDriven<User>{
        public User user=new User();
    
        // execute方法
        public String login() throws Exception {
            System.err.println("login方法....");
            UserService userService=new UserService();
            boolean success=userService.findUser(user);
            if(success) {
                return "success";
            }else {
                ServletActionContext.getRequest().setAttribute("error", "用户名或者密码错误");
                return "error";
            }
        }
        public String register() throws Exception{
            System.err.println("register方法....");
            return null;
        }
        public String kill() throws Exception{
            System.err.println("kil方法....");
            return null;
        }
        @Override
        public User getModel() {
            // TODO Auto-generated method stub
            return user;
        }
    
    
    }
    View Code

    struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
    <!-- 动态方法调用 -->
    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    
    <!-- name:配置包名  namespace:给action的访问路径定义一个命名空间-->
        <package name="MyPackage" namespace="/" extends="struts-default">
        
           <global-allowed-methods>login,register,kill</global-allowed-methods>
           
           <!-- action:配置action类
                name:决定了action访问的资源名称  servlet:url-pattern
                class:action的完整类名
                method:指定调用了action中的哪个方法来处理请求
                -->
            
            <action name="loginAction_*" class="com.web.UserAction" method="{1}">
            <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register">
            默认为转发
                
            </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction" method="execute">
            </action>
            <action name="loginActionImpl" class="com.web.ImplAction" method="execute"></action>
        </package>
    </struts>
    View Code

    c3p0.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    
        <default-config>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/world?useSSL=false</property>
            <property name="user">root</property>
            <property name="password">root</property>
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">20</property>
        </default-config>
    
    
        <named-config name="oracel">
            <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
            <property name="jdbcUrl">jdbc:oracle:thin:@//192.168.40.128/orcl</property>
            <property name="user">scott</property>
            <property name="password">scott</property>
        </named-config>
    
    
    </c3p0-config>
    View Code

    http://localhost:8080/strutsforum/loginAction_kill

    struts实现请求转发

    struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
    <!-- 动态方法调用 -->
    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    
    <!-- name:配置包名  namespace:给action的访问路径定义一个命名空间-->
        <package name="MyPackage" namespace="/" extends="struts-default">
        
           <global-allowed-methods>login,register,kill</global-allowed-methods>
           
           <!-- action:配置action类
                name:决定了action访问的资源名称  servlet:url-pattern
                class:action的完整类名
                method:指定调用了action中的哪个方法来处理请求
                -->
            
            <action name="loginAction_*" class="com.web.UserAction" method="{1}">
            <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register">
            默认为转发
                
            </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction" method="execute">
            </action>
            <action name="loginActionImpl" class="com.web.ImplAction" method="execute">
               <!-- 转发到loginActionDefault -->
               <result name="defaultAction" type="chain">loginActionDefault</result>
            </action>
        </package>
    </struts>
    View Code

    web下的:

    package com.web;
    
    import com.opensymphony.xwork2.Action;
    
    public class ImplAction implements Action{
    
        @Override
        public String execute() throws Exception {
            System.err.println("这是实现了action接口的Action");
            return "defaultAction";
        }
        
        
    
    }
    View Code

    Struts实现重定向

     

    解决中文乱码:

    web.xml中的配置:

         参数传递

     (1)接收参数(3种接收参数的方式)

    • 模型驱动

    原理:

    实现ModelDriven<T>接口种的getmodel方法,

    • 属性驱动

    原理

    再实现属性的get set方法;

    package com.web;
    
    
    
    import org.apache.struts2.ServletActionContext;
    
    import com.domain.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.serive.UserService;
    
    public class UserAction extends ActionSupport {
        //public User user=new User();
           public String username;
           public String password; 
        // execute方法
        public String login() throws Exception {
            System.err.println("login方法....");
            System.out.println(username+":"+password);
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            UserService userService=new UserService();
            boolean success=userService.findUser(user);
            if(success) {
                return "success";
            }else {
                ServletActionContext.getRequest().setAttribute("error", "用户名或者密码错误");
                return "error";
            }
        }
        public String register() throws Exception{
            System.err.println("register方法....");
            return null;
        }
        public String kill() throws Exception{
            System.err.println("kil方法....");
            return null;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    
    }
    View Code
    • 对象驱动

    原理

    步骤

    getset方法

    改jsp种的name值

    package com.web;
    
    
    
    import org.apache.struts2.ServletActionContext;
    
    import com.domain.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.serive.UserService;
    
    public class UserAction extends ActionSupport {
        public User user;
        //public User user=new User();
        /*public String username;
           public String password; */
        // execute方法
        public String login() throws Exception {
            System.err.println("login方法....");
            System.out.println(user.getUsername()+":"+user.getPassword());
            /*    User user=new User();
            user.setUsername(username);
            user.setPassword(password);*/
            UserService userService=new UserService();
            boolean success=userService.findUser(user);
            if(success) {
                return "success";
            }else {
                ServletActionContext.getRequest().setAttribute("error", "用户名或者密码错误");
                return "error";
            }
        }
        public String register() throws Exception{
            System.err.println("register方法....");
            return null;
        }
        public String kill() throws Exception{
            System.err.println("kil方法....");
            return null;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    
    }
    View Code
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    
    <head>
    <meta charset="UTF-8">
    
    <link rel="stylesheet" href="css/head.css" />
    <link rel="stylesheet" type="text/css" href="css/login.css" />
    </head>
    
    <body>
        <div class="dvhead">
            <div class="dvlogo">
                <a href="index.html">你问我答</a>
            </div>
            <div class="dvsearch">10秒钟注册账号,找到你的同学</div>
            <div class="dvreg">
                已有账号,立即&nbsp;<a href="login.html">登录</a>
            </div>
        </div>
        <section class="sec">
            <form action="${pageContext.request.contextPath}/loginAction_login" method="post">
                <div class="register-box">
                    <label for="username" class="username_label"> 用 户 名 <input
                        maxlength="20" name="user.username" type="text" placeholder="您的用户名和登录名" />
                    </label>
                    <div class="tips" ></div>
                </div>
                <div class="register-box">
                    <label for="username" class="other_label"> 设 置 密 码 <input
                        maxlength="20" type="password" name="user.password"
                        placeholder="建议至少使用两种字符组合" />
                    </label>
                    <div class="tips"style="color:red">${error}</div>
                </div>
                <div class="arguement">
                    <input type="checkbox" id="xieyi" /> 阅读并同意 <a
                        href="javascript:void(0)">《你问我答用户注册协议》</a> <a href="register.html">没有账号,立即注册</a>
                    <div class="tips"></div>
                </div>
                <div class="submit_btn">
                    <button type="submit" id="submit_btn">立 即 登录</button>
                </div>
            </form>
        </section>
        <script src="js/index.js" type="text/javascript" charset="utf-8"></script>
    </body>
    View Code

    (2)传递参数

            ActionContext

            

    package com.web;
    
    import java.util.Map;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    
    public class ImplAction implements Action{
    
        @Override
        public String execute() throws Exception {
            System.err.println("这是实现了action接口的Action");
            //返回结果跟struts.xml里的<result>标签对应
            return "defaultAction";
        }
        public String login() throws Exception{
            System.err.println("这是implaction接口下的action");
        /*    ActionContext.getContext().put("username", "123");
            ActionContext.getContext().put("password", "123");*/
            //rquest中的setAttr
            ActionContext.getContext().put("username", "123");
            ActionContext.getContext().put("password", "123");
            
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("str", "true");
            Map<String, Object> application = ActionContext.getContext().getApplication();
            application.put("context", "1");
            
            //返回值已经在struts.xml中固定
            
            return "tologin";
        }
        
    
    }
    View Code

     传递参数小案例

    ImplAction

    package com.web;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    
    public class ImplAction implements Action{
    
        @Override
        public String execute() throws Exception {
            System.err.println("这是实现了action接口的Action");
            //返回结果跟struts.xml里的<result>标签对应
            return "defaultAction";
        }
        public String login() throws Exception{
            System.err.println("这是implaction接口下的action");
        /*    ActionContext.getContext().put("username", "123");
            ActionContext.getContext().put("password", "123");*/
            //rquest中的setAttr
            ActionContext.getContext().put("username", "123");
            ActionContext.getContext().put("password", "123");
            
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("mysession", "session域");
            Map<String, Object> application = ActionContext.getContext().getApplication();
            application.put("mycontext", "context域");
            
            //获得原生方法的request
              HttpServletRequest request = ServletActionContext.getRequest();
              
              //获得原生的response
              HttpServletResponse response = ServletActionContext.getResponse();
              
              
            //返回值已经在struts.xml中固定
            
            return "tologin";
        }
        
    
    }
    View Code
    package com.web;
    
    
    
    import org.apache.struts2.ServletActionContext;
    
    import com.domain.User;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.serive.UserService;
    
    public class UserAction extends ActionSupport implements ModelDriven<User>{
        public User user=new User();
        //public User user=new User();
        /*public String username;
           public String password; */
        // execute方法
        public String login() throws Exception {
            System.err.println("login方法....");
            System.out.println(user.getUsername()+":"+user.getPassword());
            
            System.out.println("session域:"+ActionContext.getContext().getSession().get("mysession"));
            System.out.println("servletcontext域:"+ActionContext.getContext().getApplication().get("mycontext"));
    
            UserService userService=new UserService();
            boolean success=userService.findUser(user);
            if(success) {
                return "success";
            }else {
                ServletActionContext.getRequest().setAttribute("error", "用户名或者密码错误");
                return "error";
            }
        }
        public String register() throws Exception{
            System.err.println("register方法....");
            return null;
        }
        public String kill() throws Exception{
            System.err.println("kil方法....");
            return null;
        }
        @Override
        public User getModel() {
            // TODO Auto-generated method stub
            return user;
        }
        
    
    }
    View Code

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
        <!-- 动态方法调用 -->
        <constant name="struts.devMode" value="true"></constant>
        <constant name="struts.enable.DynamicMethodInvocation"
            value="true"></constant>
    
        <!-- name:配置包名 namespace:给action的访问路径定义一个命名空间 -->
        <package name="MyPackage" namespace="/"
            extends="struts-default">
    
            <!-- <global-allowed-methods>login,register,kill</global-allowed-methods> -->
              <global-allowed-methods>regex:.*</global-allowed-methods>
    
            <!-- action:配置action类 name:决定了action访问的资源名称 servlet:url-pattern class:action的完整类名 
                method:指定调用了action中的哪个方法来处理请求 -->
    
            <action name="loginAction_*" class="com.web.UserAction"
                method="{1}">
                <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
            
            
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register"> 
                默认为转发 </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction"
                method="execute">
            </action>
            <action name="loginActionImpl_*" class="com.web.ImplAction"
                method="{1}">
                <!-- 转发到loginActionDefault -->
                <result name="defaultAction" type="chain">loginActionDefault</result>
                <!-- 重定向到action(loginaction) -->
                <result name="tologin" type="redirectAction">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                    <param name="password">${password}</param>
                </result>
            </action>
        </package>
    </struts>
    View Code

    ActionContext的总结

    • ActionContext生命周期是一次请求,每次发出请求都会创建一个新的ActionContext

    就和request一样,每次创建新的Actioncontext时都会重新引用那些对象。

    • 而且不只是生命周期一样,它本身也具备了request域的功能,可以从后台携带数据到前台,

    也和request一样。

    • 通过ActionContext的子类servletActionContext可以获得那些对象
    • 通过ActionContext可以直接获得session和application各自的域对象,操作方便
    • 最重要的一点是,ActionContext本身是一个map,他存储了很多对象例如request、response,

    当然除了这些还有我们没有见过的对象

    struts和ognl常用标签

    struts标签配置

    在jsp开头引入struts标签库

    struts常用标签

    <s:iterator value="pastelist" var="paste">     iterator:  循环   value:表示传入的值,可以是集合,数组等    var:该值中的每一个变量。

    <s:property value="answernum"/>               表示元素集中的属性。比如对象中的answernum属性

    <s:if test="answernum%2==0">张大值</s:if>     

    <s:else>Lara</s:else>

    如果要访问的是包装类型,要用#

    package com.web;
    
    import java.util.List;
    
    import com.domain.Paste;
    import com.domain.User;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.serive.PasteService;
    
    public class PasteAction extends ActionSupport{
    
        public String getAllPaste() throws Exception {
            PasteService pasteservice=new PasteService();
            List<Paste> pastelist=pasteservice.FindAllPaste();
            
            User user=new User();
            user.setUsername("lara");
            user.setPassword("111");
            ActionContext.getContext().put("pastelist", pastelist);
            ActionContext.getContext().put("user", user);
            System.out.println(pastelist);
            return "index";
        }
    
    }
    View Code
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!-- 引入struts标签库 -->
    <%@taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="css/index.css">
    </head>
    <div class="dvhead">
        <div class="dvlogo">
            <a href="index.html">你问我答</a>
        </div>
        <div class="dvsearch">10秒钟注册账号,找到你的同学</div>
        <div class="dvreg">
            已有账号,立即&nbsp;<a href="login.html">登录</a>
        </div>
    </div>
    <div class="dvContent">
        <div class="dvquesleft">
    
            <div class="dvqstitle">
                <image class="imgbean" src="images/bean.jpg"> <span
                    class="qsTitle">问答</span> <span class="back"><ab href="">《《返回上一页</a></span>
            </div>
            <div class="dvtabhead">
                <div class="tabheads tabcurrent">全部问题</div>
                <div class="tabheads">我的问题</div>
                <div class="tabheads">关注问题</div>
                <div class="tabheads">问题标签</div>
            </div>
            <div class="tabContent">
                <div class="dvtags">
                    <a class="curenttag">待解决</a><span class="line"></span><a>高分</a><span
                        class="line"></span><a>新回答</a><span class="line"></span><a>已解决</a>
                </div>
                <div class="tab">
    
                    <s:iterator value="pastelist" var="paste">
                        <div class="dvques">
                            <div class="quesCount">
                                <div class="count">
                                    <s:property value="answernum" />
                                </div>
                                <div class="ques">回答数</div>
                            </div>
                            <div class="quesContent">
                                <div class="quesTitle">
                                    <s:property value="offer" />
                                    <image src="images/bean.jpg" class="bean"> <span
                                        class="spanques"><s:property value="title" /></span>
                                </div>
                                <div class="qContent">
                                    <s:property value="content" />
                                </div>
                                <div class="tags">
                                    <span class="tag">excel</span><span class="tag">程序</span>
                                </div>
                                <div class="quesUser">
                                    <image src="images/0.gif" class="imguser" />
                                    <div class="userName">
                                    <!-- 访问对象里的值要加个# -->
                                        <s:property value="#user.username"/>
                                        <div class="liulan">浏览(9) 30分钟前</div>
                                    </div>
    
                                </div>
                            </div>
                        </div>
                    </s:iterator>
                </div>
                <div class="tab hidden">2</div>
                <div class="tab hidden">3</div>
                <div class="tab hidden">4</div>
            </div>
        </div>
        <div class="dvquesright">
            <div>
                <buton class="btnques" onclick="location.href='add.html'">提个问题</buton>
            </div>
            <div class="dvorder">
                <div class="orderTitle">专家排行榜</div>
                <div class="users">
                    <image class="userface" src="images/0.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/1.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/2.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/3.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/4.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/5.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
                <div class="users">
                    <image class="userface" src="images/6.gif" />
                    <div class="dvuser">
                        <div class="userTitle">陈有龙</div>
                        <div class="userdeital">大牛6级 豆:14006</div>
                    </div>
                </div>
    
    
            </div>
    
        </div>
    
    </div>
    <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
    <script type="text/javascript">
        $(function() {
    
            $(".tabheads").click(
                    function() {
                        $(".tabheads").removeClass("tabcurrent")
                                .eq($(this).index()).addClass("tabcurrent");
                        $(".tab").hide().eq($(this).index()).show();
                    });
        });
    </script>
    <body>
    </body>
    </html>
    View Code

    valueStack运行流程



    anction原理

     详情见博客https://blog.csdn.net/xie_xiansheng/article/details/51130126

     result原理

    result是用于输出的组件,用于向页面输出一些内容,转发重定向可以理解为特殊方式的输出

    ,每一个result就是一个类型的result。他们被定义在struts-default.xml中。

    struts-default.xml源码:

    dispatcher: 转发

    chain:转发到Action

    redirect:重定向

    redirectAction:重定向到Action.

    ${username}     struts遇见不认识的会在后面拼接参数。

    loginActionDefalut?username=....

    创建拦截器的两种方式

    •  extends MethodFilterInterceptor
    • implements Interceptor

    配置拦截器

    struts.xml中配置

    注意:

    创建拦截器只能控制访问Action,不能控制访问jsp

    因为配置的拦截器中有tologin

    所以经行全局配置:

      

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
        <!-- 动态方法调用 -->
        <constant name="struts.devMode" value="true"></constant>
        <constant name="struts.enable.DynamicMethodInvocation"
            value="true"></constant>
    
        <!-- name:配置包名 namespace:给action的访问路径定义一个命名空间 -->
        <package name="MyPackage" namespace="/"
            extends="struts-default">
    
    
            <interceptors>
                <!-- 注册拦截器 -->
                <interceptor name="myintercepter"
                    class="com.web.intercepter.MyIntercepter"></interceptor>
                <!-- 注册拦截器栈 -->
                <interceptor-stack name="mystack">
                    <!-- 引入自己创建的拦截器 -->
                    <interceptor-ref name="myintercepter"></interceptor-ref>
                    <!-- 引入struts写好的20ge拦截器 -->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 指定包中的默认拦截器栈 -->
            <default-interceptor-ref name="mystack"></default-interceptor-ref>
            <!-- <global-allowed-methods>login,register,kill</global-allowed-methods> -->
            <global-allowed-methods>regex:.*</global-allowed-methods>
    
            <!-- action:配置action类 name:决定了action访问的资源名称 servlet:url-pattern class:action的完整类名 
                method:指定调用了action中的哪个方法来处理请求 -->
    
            <action name="loginAction_*" class="com.web.UserAction"
                method="{1}">
                <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
    
    
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register"> 
                默认为转发 </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction"
                method="execute">
            </action>
            <action name="loginActionImpl_*" class="com.web.ImplAction"
                method="{1}">
                <!-- 转发到loginActionDefault -->
                <result name="defaultAction" type="chain">loginActionDefault</result>
                <!-- 带参的 -->
                <result name="defaultAction" type="chain">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                </result>
                <!-- 重定向到action(loginaction) -->
                <result name="tologin" type="redirectAction">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                    <param name="password">${password}</param>
                </result>
                <!-- 不带参数的重定向 -->
                <result name="tologin" type="redirectAction">loginAction_login</result>
            </action>
        </package>
        <package name="PastePackage" namespace="/"
            extends="struts-default">
            <global-allowed-methods>regex:.*</global-allowed-methods>
            <action name="PasteAction_*" class="com.web.PasteAction"
                method="{1}">
                <result name="index">/index.jsp</result>
            </action>
        </package>
    </struts>
    View Code
    package com.web.intercepter;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
    
    public class MyIntercepter extends MethodFilterInterceptor{
    
        @Override
        protected String doIntercept(ActionInvocation invocation) throws Exception {
            System.out.println("myintercepter");
            //获取session
            Map<String, Object> session = ActionContext.getContext().getSession();
            //获取session中的user
            Object object = session.get("user");
            //判断session中是否有user数据
            if(object!=null) {
                //有,放行
                return invocation.invoke();
            }else {
                return "tologin";
            }
            
        }
    
    }
    View Code
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
        <!-- 动态方法调用 -->
        <constant name="struts.devMode" value="true"></constant>
        <constant name="struts.enable.DynamicMethodInvocation"
            value="true"></constant>
    
        <!-- name:配置包名 namespace:给action的访问路径定义一个命名空间 -->
        <package name="MyPackage" namespace="/"
            extends="struts-default">
    
    
            <interceptors>
                <!-- 注册拦截器 -->
                <interceptor name="myintercepter"
                    class="com.web.intercepter.MyIntercepter"></interceptor>
                <!-- 注册拦截器栈 -->
                <interceptor-stack name="mystack">
                    <!-- 引入自己创建的拦截器 -->
                    <interceptor-ref name="myintercepter"></interceptor-ref>
                    <!-- 引入struts写好的20ge拦截器 -->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 指定包中的默认拦截器栈 -->
            <default-interceptor-ref name="mystack"></default-interceptor-ref>
            <global-results>
               <result name="tologin" type="redirect">/login.jsp</result>
            </global-results>
            <!-- <global-allowed-methods>login,register,kill</global-allowed-methods> -->
            <global-allowed-methods>regex:.*</global-allowed-methods>
    
            <!-- action:配置action类 name:决定了action访问的资源名称 servlet:url-pattern class:action的完整类名 
                method:指定调用了action中的哪个方法来处理请求 -->
    
            <action name="loginAction_*" class="com.web.UserAction"
                method="{1}">
                <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
    
    
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register"> 
                默认为转发 </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction"
                method="execute">
                <!-- 配置全局的 -->
                <!-- <result name="tologin" type="redirect">/login.jsp</result> -->
            </action>
            <action name="loginActionImpl_*" class="com.web.ImplAction"
                method="{1}">
                <!-- 转发到loginActionDefault -->
                <result name="defaultAction" type="chain">loginActionDefault</result>
                <!-- 带参的 -->
                <result name="defaultAction" type="chain">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                </result>
                <!-- 重定向到action(loginaction) -->
                <result name="tologin" type="redirectAction">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                    <param name="password">${password}</param>
                </result>
                <!-- 不带参数的重定向 -->
                <result name="tologin" type="redirectAction">loginAction_login</result>
            </action>
        </package>
        <package name="PastePackage" namespace="/"
            extends="struts-default">
            <global-allowed-methods>regex:.*</global-allowed-methods>
            <action name="PasteAction_*" class="com.web.PasteAction"
                method="{1}">
                <result name="index">/index.jsp</result>
            </action>
        </package>
    </struts>
    View Code

     不拦截配置:login

    struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    
        <!-- 动态方法调用 -->
        <constant name="struts.devMode" value="true"></constant>
        <constant name="struts.enable.DynamicMethodInvocation"
            value="true"></constant>
    
        <!-- name:配置包名 namespace:给action的访问路径定义一个命名空间 -->
        <package name="MyPackage" namespace="/"
            extends="struts-default">
    
    
            <interceptors>
                <!-- 注册拦截器 -->
                <interceptor name="myintercepter"
                    class="com.web.intercepter.MyIntercepter"></interceptor>
                <!-- 注册拦截器栈 -->
                <interceptor-stack name="mystack">
                    <!-- 引入自己创建的拦截器 -->
                    <interceptor-ref name="myintercepter">
                      <param name="excludeMethods">login</param>
                    </interceptor-ref>
                    <!-- 引入struts写好的20ge拦截器 -->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 指定包中的默认拦截器栈 -->
            <default-interceptor-ref name="mystack"></default-interceptor-ref>
            <global-results>
               <result name="tologin" type="redirect">/login.jsp</result>
            </global-results>
            <!-- <global-allowed-methods>login,register,kill</global-allowed-methods> -->
            <global-allowed-methods>regex:.*</global-allowed-methods>
    
            <!-- action:配置action类 name:决定了action访问的资源名称 servlet:url-pattern class:action的完整类名 
                method:指定调用了action中的哪个方法来处理请求 -->
    
            <action name="loginAction_*" class="com.web.UserAction"
                method="{1}">
                <!-- 默认为转发 -->
                <result name="success" type="redirect">/index.html</result>
                <result name="error">/login.jsp</result>
            </action>
    
    
            <!-- <action name="loginActionregister" class="com.web.UserAction" method="register"> 
                默认为转发 </action> -->
            <action name="loginActionDefault" class="com.web.DefaultAction"
                method="execute">
                <!-- 配置全局的 -->
                <!-- <result name="tologin" type="redirect">/login.jsp</result> -->
            </action>
            <action name="loginActionImpl_*" class="com.web.ImplAction"
                method="{1}">
                <!-- 转发到loginActionDefault -->
                <result name="defaultAction" type="chain">loginActionDefault</result>
                <!-- 带参的 -->
                <result name="defaultAction" type="chain">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                </result>
                <!-- 重定向到action(loginaction) -->
                <result name="tologin" type="redirectAction">
                    <param name="actionName">loginAction_login</param>
                    <param name="username">${username}</param>
                    <param name="password">${password}</param>
                </result>
                <!-- 不带参数的重定向 -->
                <result name="tologin" type="redirectAction">loginAction_login</result>
            </action>
        </package>
        <package name="PastePackage" namespace="/"
            extends="struts-default">
            <global-allowed-methods>regex:.*</global-allowed-methods>
            <action name="PasteAction_*" class="com.web.PasteAction"
                method="{1}">
                <result name="index">/index.jsp</result>
            </action>
        </package>
    </struts>
    View Code

     myintercepter.class

    package com.web.intercepter;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
    
    public class MyIntercepter extends MethodFilterInterceptor{
    
        @Override
        protected String doIntercept(ActionInvocation invocation) throws Exception {
            System.out.println("myintercepter");
            //获取session
            Map<String, Object> session = ActionContext.getContext().getSession();
            //获取session中的user
            Object object = session.get("user");
            //判断session中是否有user数据
            if(object!=null) {
                //有,放行
                return invocation.invoke();
            }else {
                return "tologin";
            }
            
        }
    
    }
    View Code

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    
    <head>
    <meta charset="UTF-8">
    
    <link rel="stylesheet" href="css/head.css" />
    <link rel="stylesheet" type="text/css" href="css/login.css" />
    </head>
    
    <body>
        <div class="dvhead">
            <div class="dvlogo">
                <a href="index.html">你问我答</a>
            </div>
            <div class="dvsearch">10秒钟注册账号,找到你的同学</div>
            <div class="dvreg">
                已有账号,立即&nbsp;<a href="login.html">登录</a>
            </div>
        </div>
        <section class="sec">
            <form action="${pageContext.request.contextPath}/loginAction_login" method="post">
                <div class="register-box">
                    <label for="username" class="username_label"> 用 户 名 <input
                        maxlength="20" name="username" type="text" placeholder="您的用户名和登录名" />
                    </label>
                    <div class="tips" ></div>
                </div>
                <div class="register-box">
                    <label for="username" class="other_label"> 设 置 密 码 <input
                        maxlength="20" type="password" name="password"
                        placeholder="建议至少使用两种字符组合" />
                    </label>
                    <div class="tips"style="color:red">${error}</div>
                </div>
                <div class="arguement">
                    <input type="checkbox" id="xieyi" /> 阅读并同意 <a
                        href="javascript:void(0)">《你问我答用户注册协议》</a> <a href="register.html">没有账号,立即注册</a>
                    <div class="tips"></div>
                </div>
                <div class="submit_btn">
                    <button type="submit" id="submit_btn">立 即 登录</button>
                </div>
            </form>
        </section>
        <script src="js/index.js" type="text/javascript" charset="utf-8"></script>
    </body>
    View Code
  • 相关阅读:
    7进程、线程、协程
    架构
    5oop面向对象编程
    2流程控制
    redis
    1HTML
    3.函数、递归、模块
    2、变量、数据类型、运算符、流程控制
    一个小公司的性能测试工程师应该如何开展工作
    程序代码调优工具perf学习记录
  • 原文地址:https://www.cnblogs.com/wq-9/p/10886834.html
Copyright © 2020-2023  润新知