1. Crie um novo projeto da Web e adicione um pacote JAR no diretório Lib
Pacotes Jar Main: Pacote Relacionado STRUTS2, MyBatis3.3 Pacote relacionado, MySQL-Connector-Java-5.1.22-bin.jar, GSON-2.1.jar
2. Configure o web.xml, adicione um filtro STRUTSPERPAREANDEXECUTEFILTER e manuseie todas as solicitações *.Action;
<?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" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xmls/javaee/web-web-web-web-web--/java.sun.com/xmls/javaeeeee/web-web-web-web-web-web-web-web-web-web-web-web-web-web-web-/java.sun.com/ <liber-name> ms </sisplay-name> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareAndExecuteFilter </filter-cass> </filterl-mapping> <name> struts2 </filterlame> <filterMlame> <name> <name> struts2 </filterlame> <filterMlame> <name> <name> <name> <namenl. </filter-mapping> <lorde-fil-list> <lmed-File> index.jsp </-Welcome-File> </list-List> </web-app>
Verifique o código fonte do Dofilter deste filtro e faça o seguinte:
1. Determine se o URL excluído por struts está definido (struts.action.excludepattern, correspondido pela expressão regular). Se houver e o caminho atual atender às regras, a solicitação será encaminhada para o próximo objeto na cadeia de filtros e não será entregue ao Struts2 para processamento.
if (excluiDPatterns!
2. Encontre o ActionMapping: Pesquise o método de preparação para FindActionMapping. Se não for encontrado, a solicitação será encaminhada para o próximo objeto na cadeia de filtros e não será entregue ao Struts2 para processamento; Se o ActionMapping for encontrado, o método de execução das operações de execução é chamado para começar a executar a ação; A figura a seguir é o caso de encontrar o Sapping Action com base no URL;
3. Configure o arquivo struts.xml. Essa demonstração demonstra principalmente a transmissão dos dados do formato JSON para o front -end, define o tipo de resultado para o formato JSON e, é claro, ele também pode ser definido como outros;
<? xml versão = "1.0" Encoding = "utf-8"?> <! Doctype Struts public "-// Apache Software Foundation // DTD Struts Configuration 2.3 // en" "http://struts.apache.org/dts/stuts-2.3.dtd"> <stuts> name = "padrão" estends = "struts-default, json-default"> <lobal-sults> <resultado type = "json"> <param name = "root"> json </param> <param name = "contenttype"> text/html </param> </resultado> </global-results> <ction name = " name = "QueryallUser" Method = "QueryallUser"> <SIFORD>.
4. Configure mybatis.xml e userMapper.xml,
Configure o Cacheenabled para True e habilite o cache do Nível 2;
Configurando informações relacionadas ao DataSource: O tipo é formulário de pool de conexão combinada, PoolMaximumActiveConnections possui o número de conexões ativas (ou seja, em uso) a qualquer momento, o valor padrão é: 10.
Configurar Mappings de mapeamento de classe de entidade // <mapper Resource = "MS/Model/UserMApper.xml"/>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <!--Enable Level 2 Cache-> <Configuração name = "Cacheenabled" value = "true" /> </fastings> <ambientes default = "desenvolvimento"> <ambiente id = "desenvolvimento"> <transação value="jdbc:mysql://localhost:3306/demo" /> <property name="username" value="root" /> <property name="password" value="admin" /> <property name="poolMaximumActiveConnections" value="10" /> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="select 1 as PoolpingQuery "/> </DataSource> </ambiente> </ambientes> <Mappers> <Mapper Resource =" MS/Model/UserMapper.xml "/> </ppers> </figuration>
Configurar UserMApper.xml, configurar o cache como ehcache e parâmetros relacionados, lembre -se de que a classe de entidade precisa implementar a interface serializável
<? xml versão = "1.0" coding = "utf-8"?> <! Doctype mapepper public "-// mybatis.org//dtd mapper 3.0 //" "http://mybatis.org/dtd/mybatis-3mpper.dt"mpapper /> ---> <!-Usando o cache ehcache-> <cache type = "org.mybatis.caches.ehcache.loggingehcache"> <names name = "timeToidleSeConds" value "3600" /> <!-1 hora o intervalo entre o cache a partir da data da criação da hora do tempo da hora do tempo da hora da hora do tempo da hora do tempo do tempo do tempo do tempo do tempo do tempo do tempo do tempo do tempo do tempo do tempo da cache "3600" /> <! value = "3600"/> <!-1 hora após a criação do cache, o tempo entre a data do último acesso ao cache até o tempo de expiração-> <propriedade name = "maxentrieslocAlheap" value = "1000"/> <nome da propriedade = "maxentrieslocaldisk"/"10000000"/> <names = "Nome =" <!-new-> <insert id = "saveUser" parametertype = "ms.model.user"> inserir no usuário (conta, nome, endereço) valores ( #{conta}, #{name}, #{endereço}) </insert> <select Id = "queryallUser" resultType = "ms.model) </leclect> </pappper> 5. Código -chave
Camada dao:
Primeiro, crie uma classe para obter o SQLSessionFactory e projetá -la em um padrão de singleton;
pacote ms.dao.base; importar java.io.ioException; importar org.apache.ibatis.io.resources; importar org.apache.ibatis.session.sqlSessionFactory; importação org.apache.ibatis.session.SessGorgerBuilder; SQLSessionFactory SessionFactory; Private mySessionFactory () {} public estático sincronizado SQLSessionFactory getSqlSessionFactory () {if (sessionFactory == null) {try {sessionFactory = new SQLSessionFactoryBuilder (). Build (Recursos.GeRESourCeasReader ("Mybatis-Config.xml" retorno sessionfactory; } catch (ioexception e) {Logger.getLogger (mySessionFactory.class) .error ("GetSqlSessionFactory Erro."); E.PrintStackTrace (); retornar nulo; }} else {return sessionFactory; }}}Em seguida, o Userdao, que obtém o SQLSession por meio de OpenSession. Observe que o controle da transação pode ser realizado através da confirmação e reversão do SQLSession. Obviamente, se houver apenas uma operação SQL, não haverá controle de transação (este exemplo é apenas uma demonstração);
pacote ms.dao; importar java.util.ArrayList; importar java.util.list; importar org.apache.ibatis.session.sqlsession; importar ms.dao.base.mySessionFactory; importação ms.model.user; classe pública signes {public vaid) MySessionFactory.GetSqlSessionFactory (). OpenSession (); tente {string declaration = "userMapper.saveUser"; session.insert (instrução, usuário); session.Commit (true); } catch (Exceção e) {session.rollback (true); E.PrintStackTrace (); lançar uma nova exceção ("Erro no método add"); } finalmente {session.close (); }} list public <suser> queryallUser () lança Exceção {SqlSession Session = mySessionFactory.getSqlSessionFactory (). OpenSession (); List <suser> usuários = new ArrayList <suser> (); tente {string declaration = "userMApper.QueryallUser"; usuários = session.SelectList (Declaração, 1); session.Commit (true); } catch (Exceção e) {session.rollback (true); E.PrintStackTrace (); lançar uma nova exceção ("Erro no método de QueryallUser"); } finalmente {session.close (); } retornar usuários; }} Camada de serviço:
Modelo: Não
Camada de ação:
Converter em dados de formato JSON e retorne -os ao front -end;
pacote ms.action; importar java.io.printwriter; importar java.util.list; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.htpServletLeResponse; importador.model.useracy; ms.Service.ERSVICE.USERSVICE; org.apache.struts2.servletActionContext; importar com.google.gson.gson; public class Useraction {logger logger = logger.getLogger (userAction.class); Uservice privado UserService Service = new Userservice (); public void addUser () {printWriter out = null; tente {httpServletRequest request = servletActionContext.getRequest (); HttpServletResponse Response = servletActionContext.getResponse (); Response.setContentType ("Texto/html; charset = utf-8"); String conta = request.getParameter ("conta"); Nome da string = request.getParameter ("nome"); String endereço = request.getParameter ("endereço"); Usuário do usuário = novo usuário (); user.setAccount (conta); user.setAddress (endereço); user.setName (nome); userService.add (usuário); out = Response.getWriter (); out.Write (New Gson (). Tojson ("Sucesso")); } catch (Exceção e) {e.printStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (new gson (). Tojson ("Fail")); } finalmente {out.flush (); out.Close (); }} public void queryallUser () {printWriter out = null; tente {httpServletResponse Response = servletActionContext.getResponse (); Response.setContentType ("Texto/html; charset = utf-8"); Gson gson = new gson (); LIST <usery> userlist = userservice.QueryallUser (); String gSonstr = gson.tojson (UserList); out = Response.getWriter (); out.write (GSonstr); } catch (Exceção e) {e.printStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (new gson (). Tojson ("Fail")); } finalmente {out.flush (); out.Close (); }}}Código front-end:
<%@ página de página = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitório // en" "http://www.w3.org/tr/html4/loose.dtd"><html> <head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> insert aqui </title> <estilo> <estilo. 20px;}</style></head><body><div style="text-align: center;"> <div><label>Account: </label><input id="account" type="text"/></div> <div><label>Name: </label><input id="name" type="text"/></div> <div><label>Address: </label><input id="address" type = "text"/> </div> <div> <button id = "adduser"> add </botão> </div> <h3> Lista de usuários: </h3> <ul id = "userlist"> </ul> <script type = "text/javascript" src = "js/jQuery-1.11.1.minjs"> $ .ajax ({url: 'QueryallUser.action', type: 'post', datatype: 'json', sucesso: function (data) {try {for (var i = 0; i <data.length; i ++) {$ ("#userList"). style = 'cor: vermelho'> id = "+dados [i] .id+" </span>, conta = "+dados [i] .Account+", name = "+dados [i] .name+", endereço = "+dados [i] .Address+" </li> "); }} catch (e) {}; }, erro: function (e) {alert ("erro sys"); }}); $ ("#addUser"). on ("clique", function () {var de conta = $ ("#conta"). val (); var name = $ ("#name"). Sucesso: Data) {Try {$ ("#UserList"). Append ("<li> Account =" }); }); </script> </body> </html>6. Efeito do teste:
Struts2 funciona normalmente;
Teste se o cache secundário está ok e consulte todos os usuários;
Primeira consulta: Cache perdeu, acesse o banco de dados:
As segundas e próximas múltiplas consultas, hits de cache, nenhum acesso ao banco de dados:
@Author um codificador semelhante ao vento
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.